عبود سمير

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

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

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

  • Days Won

    6

السُّمعة بالموقع

171 Excellent

المعلومات الشخصية

  • النبذة الشخصية سمير عبود من الجزائر مطور مواقع ويب

3 متابعين

  1. مرحباً @Elsayed Elsayed بما أنك قمت بالتسجيل فيُمكنك البدأ في مشاهدة الدروس. بمجرد شرائك لدورة ما سترسل لك التفاصيل عبر البريد الالكتروني إن كان لديك حساب مسجل في أكاديمية حسوب فستضاف هذه الدورة لحسابك أو سينشئ لك حساب جديد. لكن إذا كنت تواجه أية مشكلة فنرجو منك التوجه إلى مركز المساعدة و فتح تذكرة للمشكلة التي تواجهها وسيتم الرد عليك في أقرب وقت و توجيهك بشكل جيد. بالتوفيق
  2. مرحباً محمد ... للحصول على أول عمل في مواقع العمل الحر ليس فقط فريلانسر بل جميع المنصات التي توفر هذه الخدمة عليك ب: إختيار مجال واحد و تطوير نفسك في هذا المجال بناء معرض أعمالك في هذا المجال حتى تُبين للعملاء أنه لديك خبرة و تكسب ثقتهم التواجد بكثرة على منصات العمل الحر و تقديم العروض على المشاريع لحظة نزولها على المنصة أولاً بأول لأن العميل ليس لديه وقت لمشاهدة جميع العروض و إذا لم تقدم عرضك في البداية لن يراه العميل لأن المنافسة شديدة. قد يشاهد العميل عرضك و يريد التواصل معك فإذا لم يجد حسابك نشط في ذلك الوقت سيتواصل مع غيرك لا تتصنع في تقديم العروض. حاول إقناع العميل بأنك قادر على تنفيذ المشروع و لا تُقدم عروض على مشاريع ليست لديك قُدرة على تنفيذها عليك بالصبر لأن هذه المرحلة تحتاج صبر كبير وأخيراً فالمسألة مسألة أرزاق قد تحصل على أول عمل بدون أي جهد و قد تبذل جهد كبير و لن تحصل على عمل. عليك بوضع عرض في المتوسط. فلا تُخفض السعر كثيراً و لا ترفعه كثيراً عند الحصول على أول عمل لك عليك كسب العميل و إذا طلب منك تعديلات لن تحتاج منك وقت كثير فقم بعملها . و إذا استطعت تقديم بعض الخدمات الإضافية مجانا فهذا جيد و سيُعجب العميل إضافة إلى أن أي عمل مُستقبلي لهذا العميل سيكون عن طريقك كُن لطيفا في تعاملك مع صاحب المشروع هذه بعض من النصائح و هناك العديد من المقالات في الأكاديمية لو قرأت بعضها فستستفيد جدا: إضغط هنا أيضا أدعوك لمشاهدة هذه السلسلة فستجد فيها بعض النصائح المٌفيدة لك: إضغط هنا بالتوفيق
  3. مرحباً ... يُمكنك عمل البرنامج بهذا الشكل و موجود أيضا الشرح في التعليقات: #include <iostream> using namespace std; // تعريف الصنف مصفوفة class Matrix { // تعريف المتغيرات الأعضاء public: int row_size, col_size; public: int **array2d; // constructor 1 public: Matrix() { cout << "Constructor 1 is called" << endl; this->row_size = 3; this->col_size = 3; this->array2d = new int *[this->row_size]; for (int i = 0; i < this->row_size; i++) { this->array2d[i] = new int[this->col_size]; } } // constructor 2 public: Matrix(int row_size, int col_size) { cout << "Constructor 2 is called" << endl; this->row_size = row_size; this->col_size = col_size; this->array2d = new int *[this->row_size]; for (int i = 0; i < this->row_size; i++) { this->array2d[i] = new int[this->col_size]; } } // destructor public: ~Matrix() { cout << "\nDestructor is called" << endl; for (int i = 0; i < this->row_size; ++i) delete[] this->array2d[i]; delete[] this->array2d; } // دالة مساعدة لقراءة عناصر المصفوفة من المستخدم void read_els() { for (int i = 0; i < this->row_size; ++i) { for (int j = 0; j < this->col_size; ++j) { cout << "Enter El: [" << i << "][" << j << "]: " << endl; cin >> this->array2d[i][j]; } } } // دالة مساعدة لطباعة عناصر المصفوفة void print_els() { for (int i = 0; i < this->row_size; ++i) { for (int j = 0; j < this->col_size; ++j) { printf("%d ", this->array2d[i][j]); } printf("\n"); } }; // دالة لجمع مصفوفتين و ترجع الناتج في مصفوفة Matrix add(Matrix *mat) { Matrix m(this->row_size, this->col_size); for (int i = 0; i < m.row_size; ++i) { for (int j = 0; j < m.col_size; ++j) { m.array2d[i][j] = this->array2d[i][j] + mat->array2d[i][j]; } } return m; } // دالة لطرح مصفوفتين و ترجع الناتج في مصفوفة Matrix sub(Matrix *mat) { Matrix m(this->row_size, this->col_size); for (int i = 0; i < m.row_size; ++i) { for (int j = 0; j < m.col_size; ++j) { m.array2d[i][j] = this->array2d[i][j] - mat->array2d[i][j]; } } return m; } // دالة لضرب مصفوفتين و ترجع الناتج في مصفوفة Matrix mul(Matrix *mat) { Matrix m(this->row_size, mat->col_size); int tmp = 0; for(int i = 0; i < m.row_size; ++i) { for (int j = 0; j < m.col_size; ++j) { tmp = 0; for (int k = 0; k < this->col_size; ++k) { tmp += this->array2d[i][k] * mat->array2d[k][j]; } m.array2d[i][j] = tmp; } } return m; } // دالة لضرب مصفوفة في مُعامل سنستعملها في المضاعفة أو التكعيب أو اي كان و ترجع الناتج في مصفوفة Matrix mul_k(int k) { Matrix m(this->row_size, this->col_size); for (int i = 0; i < m.row_size; ++i) { for (int j = 0; j < m.col_size; ++j) { m.array2d[i][j] = k * this->array2d[i][j]; } } return m; } }; int main() { // تعريف مؤشرين لمصفوفتين Matrix *m1 = new Matrix(2, 2); Matrix *m2 = new Matrix(2, 2); cout << "Enter m1 elements: " << endl; m1->read_els(); // قراءة عناصر المصفوفة الأولى cout << "Enter m2 elements: " << endl; m2->read_els(); // قراءة عناصر المصفوفة الثانية if (m1->row_size != m2->row_size || m1->col_size != m2->col_size) { // في حالة عدم تساوي حجم المصفوفتين لا يُمكننا عمل عمليتي الجمع و الطرح cout << "can not make addition or subtraction"; } else { cout << "m1 + m2 = " << endl; m1->add(m2).print_els(); // القيام بعملية الجمع ثم عرض الناتج cout << "m1 - m2 = " << endl; m1->sub(m2).print_els(); // القيام بعملية الطرح ثم عرض الناتج } if (m1->col_size != m2->row_size) { // عرض رسالة في حالة عدم إمكانية عمل عملية الضرب cout << "Error! column of first matrix not equal to row of second."; } else { cout << "m1 X m2 = " << endl; m1->mul(m2).print_els(); // القيام بعملية الضرب ثم عرض الناتج } cout << "2 X m1 = " << endl; m1->mul_k(2).print_els(); // القيام بعملية المضاعفة ثم عرض الناتج delete m1; // إستدعاء المدمر لتنظيف الذاكرة و مسح الحيز المحجوز من طرف المؤشر الأول delete m2; // إستدعاء المدمر لتنظيف الذاكرة و مسح الحيز المحجوز من طرف المؤشر الثاني } يُمكنك أيضا تجربة البرنامج من خلال هذا الرابط أيضا أنصحك بمتابعة سلسلة تعلم سي بلس بلس للمحترفين على أكاديمية حسوب فهي مفيدة و مُستمرة خاصة هذا الدرس عن المؤشرات الدرس 19: المؤشرات (Pointers) في Cpp بالتوفيق
  4. مرحباً أخي ... لعمل نظام تسجيل الدخول نقوم أولا بإنشاء جدول للمستخدمين ثم نقوم بعمل صفحة و لتكن مثلا login_pdo.php <?php session_start(); $host = "localhost"; $username = "root"; $password = ""; $database = "testing"; $message = ""; try { $connect = new PDO("mysql:host=$host; dbname=$database", $username, $password); $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(isset($_POST["login"])) { if(empty($_POST["username"]) || empty($_POST["password"])) // في حالة عدم إدخال البيانات { $message = '<label>All fields are required</label>'; } else { $query = "SELECT * FROM users WHERE username = :username AND password = :password"; $statement = $connect->prepare($query); $statement->execute( array( 'username' => $_POST["username"], 'password' => $_POST["password"] ) ); $count = $statement->rowCount(); if($count > 0) // إذا وجدنا البيانات مسجلة في جدول المستخدمين { $_SESSION["username"] = $_POST["username"]; // نحفظ إسم المستخدم ضمن الجلسة header("location:dashboard.php"); // ونقوم بتحويل المستخدم إلى لوحة التحكم } else { $message = '<label>Wrong Data</label>'; // في حالة عدم وجود البيانات نرجع الرسالة } } } } catch(PDOException $error) { $message = $error->getMessage(); // في حالة حدوث خطأ في الإتصال مع قاعدة البيانات } ?> ملف dashboard.php يكون بهذا الشكل : <?php session_start(); if(isset($_SESSION["username"])) // بمعنى إذا كان إسم المستخدم موجود في الجلسة هذا يعني أن هناك مستخدم قام بتسجيل الدخول { echo '<h3>Login Success, Welcome - '.$_SESSION["username"].'</h3>'; // رسالة ترحيبية فقط echo '<br /><br /><a href="logout.php">Logout</a>'; // رابط لتسجيل الخروج } else // في حالة عدم وجود شخص مسجل دخوله نمنع الوصول إلى لوحة التحكم { header("location:login_pdo.php"); // نقوم بتحويل المستخدم إلى صفحة تسجيل الدخول } ?> و ملف ال logout.php يكون بهذا الشكل <?php session_start(); session_destroy(); // تحطيم الجلسة header("location:login_pdo.php"); // التحويل إلى صفحة تسجيل الدخول ?> و هذا نظام بسيط لتسجيل الدخول أرفقت لك الملفات. login_pdo.zip بالتوفيق
  5. مرحباً ... ماهو المشكل أو الخطأ الذي يظهر الآن . فطريقة العرض الآن صحيحة. بقي الإتصال مع قاعدة البيانات و جلب البيانات بشكل صحيح . إذا لم تصل إلى الحل يُرجى إرفاق مجلد المشروع كاملا بالإضافة إلى قاعدة البيانات حتى نُعاين المُشكلة
  6. و عليكم السلام أظن أنه يشير إلى كاتب المقال لأنه لما بحثت في مدونة مستقل أو مدونة خمسات وجدت أسفل المقال بطاقة لصاحب المقال أو الذي كتبه بالإضافة إلى رابط الحساب الشخصي كما هو موضح في الصور أدناه : يُمكنك الإستفسار حول الموضوع من خلال مركز المساعدة بفتح تذكرة لتساؤلاتك أو إستفسارك و سيقوم فريق الدعم بالإجابة عليها في أقرب وقت بالتوفيق
  7. و عليكم السلام نعم فهذه مشكلة خصوصا إذا كان التغيير من الإيجاب إلى السلب و كانت الفترة طويلة أي بعد مرور مدة على إنتهاء المشروع و إستلامه من طرف العميل يأتي ليُعيد تقييم المُستقل سلباً و هذا الشيء يُعيق المستقل بدرجة كبيرة و يُخفض من حظوظه في قبول العروض التي يُقدمها على المشاريع. سبق و أن أعاد أحد العملاء تقييمي على منصة مُستقل لكن التقييم كان إيجابيا .أظن أنه من الأحسن أن تضع الإدارة إجراءات إضافية بخصوص هذا الأمر. أيضا أتمنى من الإدارة أن تُتيح للمستقلين تقييم أصحاب المشاريع حتى تُصبحَ لديهم سُمعة داخل المنصة يخافون عليها و ليس فقط وضع رد على تقييم صاحب المشروع. لقد بحثت بخصوص موضوع إعادة التقييم في الأسئلة الشائعة و في شروط الإستخدام و لم أجد شيئا يتعلق بهذا الأمر. و أظن أنه يُمكن الرجوع إلى الإدارة و الدعم الفني في حالة أعاد العميل تقييم المُستقل سلباً للنظر في الأمر و حل المُشكلة . لكن من الأحسن من البداية عدم السماح للعميل بهذا الشيء. بالتوفيق
  8. مرحباً @Sid Ahmed4 أكواد عرض مقطع الفيديو ليست بها أخطاء فلعرض فيديو نستعمل وسم video بالشكل التالي مثلا : <video width="320" height="240" controls> <source src="video_src.mp4" type="video/mp4"> Your browser does not support the video tag. </video> لكن أظن أنك أخطأت في الشرط فلمقارنة سلسلتين نصيتين نستعمل "==" و ليس "=" أو نستعمل الدالة strcmp بهذا الشكل : <?php $ipath = pathinfo($value['pofl'], PATHINFO_EXTENSION); if ($ipath == 'jpg'){ // أكواد العرض في حالة اللاحقة jpg }elseif ($ipath == 'mp4') { // أكواد العرض في حالة اللاحقة mp4 } أو <?php $ipath = pathinfo($value['pofl'], PATHINFO_EXTENSION); if (strcmp($ipath, "jpg") == 0){ // أكواد العرض في حالة اللاحقة jpg }elseif (strcmp($ipath, "mp4") == 0) { // أكواد العرض في حالة اللاحقة mp4 } تأكد جيداً من مسار الفيديو "src" الذي تريد عرضه. بالتوفيق
  9. مرحباً محمد .. يُمكنك عمل البرنامج بهذا الشكل : #include <iostream> using namespace std; // دالة مساعدة لطباعة عناصر مصفوفة عددية void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } // دالة مساعدة لمعرفة إذا كان العدد أولي أو لا bool isPrime(int num) { bool flag = false; for(int i = 2; i <= num/2; ++i) { if(num % i == 0) { flag = true; break; } } return !flag; } // دالة تستقبل مصفوفة أعداد و ترجع أصغر عدد أولي إن كان موجودا int min_prime(int arr[], int size) { int min = arr[0]; for (int i = 0; i < size; ++i) { if (min > arr[i] && isPrime(arr[i])) min = arr[i]; } return min; } int main() { // تعريف مصفوفة int arr[] = {31, 12, 11, 6, 22, 8, 89, 76, 91, 111}; // حساب عدد القيم التي تحتويها المصفوفة int n = sizeof(arr) / sizeof(arr[0]); // طباعة عناصر المصفوفة printArray(arr, n); int min = min_prime(arr, n); if (isPrime(min)) cout << "Min Prime is: " << min; else cout << "Array does not contain any prime number"; } بعد تشغيل البرنامج ستظهر النتيجة بهذا الشكل : يُمكنك تجربة البرنامج من خلال هذا : الرابط من خلال البرنامج و الشرح يُمكنك عمل التقرير و شرح البرنامج بالرسم الذي تريده بالتوفيق
  10. مرحباً يونس .. أنا لم أفهم جيداً ماذا تقصد ؟ هل تقصد أن المطلوب هو البحث عن أطول عنصر في المصفوفة مكون من العدد 1 مثلا لو عندنا المصفوفة التالية [11,000,11111,111] يعطيك البرنامج العدد 11111. أم أن المطلوب مثلا يكون عندك مصفوفة بهذا الشكل [0, 1, 1, 0, 0, 1, 1, 1, 0] و يعطيك البرنامج السلسلة 111 و هذا ما فهمته من السؤال إذا كان هذا هو المطلوب يُمكنك كتابة البرنامج بالشكل التالي : #include <iostream> using namespace std; // دالة مساعدة لطباعة عناصر مصفوفة عددية void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } // دالة تستقبل مصفوفة أعداد و ترجع سلسلة نصية مكونة من أطول سلسلة وحدات string max_series(int arr[], int size) { // تعريف المتغيرات المستعملة string l, tmp; int j, i = 0; // القيام بحلقة على عناصر المصفوفة while (i < size) { // إذا كان العنصر يساوي 1 if (arr[i] == 1) { j = i; // القيام بحلقة مادامت العناصر القادمة تساوي 1 while (arr[j] == 1) { // تركيب سلسلة الوحدات tmp += to_string(arr[j]); j++; } // شرط إذا كانت سلسلة الوحدات الحالية أطول من السلسلة المخزنة السابقة if (tmp.length() > l.length()) { l = tmp; // تغيير السلسلة السابقة بالسلسلة الحالية tmp = ""; // إفراغ السلسلة الحالية } i = j; // تغيير فهرس الحلقة } else { i++; } } return l; } int main() { // تعريف مصفوفة int arr[] = {0, 1, 1, 0, 0, 1, 1, 1, 1, 0}; // حساب عدد القيم التي تحتويها المصفوفة int n = sizeof(arr) / sizeof(arr[0]); // طباعة عناصر المصفوفة printArray(arr, n); // إستدعاء الإقتران string l = max_series(arr, n); if (l.length() <= 0) cout << "array does not contains any 1"; else cout << "serie: " << l << " ==> size: " << l.length(); } و عند تشغيل البرنامج سيعطيك النتيجة التالية: يُمكنك تجربة البرنامج من خلال هذا: الرابط بالتوفيق
  11. مرحباً أحمد .. هناك العديد من الخيارات لبرمجة تطبيقات الهاتف : بناء تطبيقات أصيلة ( native ) بإستخدام اللغات الأصلية فمثلا للأندرويد جافا أو كوتلن و لل iOS سويفت أو أوبجكتيف سي بناء تطبيقات أصيلة بإستعمال أحد الأطر او ( frameworks ) مثل : React Native أو Flutter أو Xamarin بحيث ستقوم بكتابة الأكواد باللغة التي بُني عليها الإطار فمثلا React Native ستستخدم JavaScript و Futter لغة Dart و Xamarin لغة c# بحيث عند عملية البناء ستستخدم أدوات المنصة لتصدير التطبيق و سيتم تحويل الأكواد إلى أكواد أصيلة ( نتيف ) و لهذا يُسمى هذا النوع من التطبيقات ب ( compiled app ) و أهم ميزة لهذا النوع هو الحصول على تطبيقات بنفس أداء التطبيقات الأصيلة تقريباً و تكون متعددة المنصة أي للأندرويد و ال iOS أي cross platform إنطلاقا من كتابة كود واحد بناء تطبيقات هجينة بإستخدام منصة Cordova أو Ionic و هذه المنصات هي منصات cross platform أي ستقوم بكتابة كود واحد و هذا الكود يعمل على أنظمة متعددة سواء أندرويد أو iOS . لكن التطبيقات التي يتم بناؤها تكون عبارة عن تطبيق ويب أي أن التطبيق في الأخير سيعمل على الهاتف و كأنه تطبيق هاتف عادي لكن في الحقيقة هو عبارة عن صفحات ويب أو تطبيق ويب يعمل على المتصفح . و إن صح التعبير فمنصة cordova تقوم بتغليف تطبيق الويب بطبقة تُسمى (WebView) حتى يعمل على الهاتف و كأنه تطبيق عادي. العيب في هذه التطبيقات أنها أبطأ مقارنةً بالنوعين السابقين خصوصا في التطبيقات التي تحتاج إلى التعامل مع موارد و مُحسسات الهاتف لكن ما يٌميزها أنك لن تحتاج إلى تعلم لغات أخرى فقط html5 و CSS و جافاسكربت بالإضافة إلى كيفية التعامل مع منصة Cordova أنصحك بالإطلاع على كافة الخيارات الموجودة و دراستها و الإطلاع على الفروق بينها ثم تختار ما يُناسبك و تقوم بتعلمه و هذا الدرس لمعرفة الفرق بين التطبيقات الأصيلة و التطبيقات الهجينة و أيضا الإطلاع على هذا الفيديو باللغة الإنجليزية و أيضا إبحث في الإنترنت عن بعض الشروحات و المقالات لتصل إلى الإختيار الأفضل بالنسبة لك . بخصوص كم يستغرق من وقت تعلم تقنية ما ؟ فلنكن واضحين مع بعض إحتراف الشخص لتقنية ما يأتي بالممارسة و التطبيق العملي و القيام بالمشاريع و أنصحك أنك طالما إخترت هذا المجال لا تسأل هذا السؤال ثانيةً لأنك كل ما تعمقت فيه أكثر كل ما تعلمت أشياء جديدة كل ما ظهرت أشياء جديدة لتتعلمها. أما عن تعلم الأساسيات فهذا الأمر راجع للشخص نفسه . بخصوص برمجة تطبيقات الأندرويد بلغة جافا أو كوتلن فإن أفضل منصة هي أندرويد ستوديو . بالتوفيق
  12. يُمكن أن الإجراءات تأخذ بعض الوقت و من خلال الرد أخبرك أنه سيتم مراسلتك مجدداً في أقرب وقت و لم يقومو برفض الطلب. على كل حال تستطيع الإستفسار ثانيةً من خلال الردود في نفس التذكرة
  13. بما أنهم لم يتيحو لك الإختبار فهناك سبب مُقنع لذلك. و أظن أنهم قد ذكروه لك في الردود فإذا كنت لا تعرف سبب الرفض استعلم عنه و سيُخبرونك به بالتوفيق
  14. مرحباً @البراء الحسني هل قمت فعلا بفتح تذكرة و قمت بالشرح جيداً و الأهم من ذلك هل ظهرت التذكرة مع تذاكرك أم لا ؟ عادة عندما أتواصل مع الدعم الفني يتم الرد علي في ثاني يوم على الأكثر لا أدري صراحةً ماهي المشكلة و هناك إحتمالين : لم تقم بفتح التذكرة بالشكل المطلوب لم يتمكن فريق الدعم من الرد عليك نظراً للضغط الكبير أنصحك بإعادة فتح تذكرة من جديد و قم بإتباع المراحل التالية : التوجه إلى مركز المساعدة من خلال هذا الرابط: إضغط هنا ستجد صفحة مثل الصورة في القسم تذاكري ستجد كافة التذاكر التي فتحتها و في قسم قاعدة المعرفة ستجد بعض الإرشادات و الأسئلة الشائعة و بعض المقالات المهمة و في القسم فتح تذكرة يُمكنك فتح تذكرة جديدة قُم بالضغط على فتح تذكرة و ستظهر لك الصفحة أدناه قم بإختيار أكاديمية حسوب ثم الطلاب و الدورات المدفوعة ثم إضغط التالي ستظهر لك صفحة مثل الصورة : أكتب الموضوع و نص الرسالة جيداً ثم إضغط على إرسال و سيتم إرسال التذكرة و عند التوجه إلى قسم تذاكري ستجد التذكرة التي فتحتها هناك و عندما تضغط عليها ستجد كافة الردود و سيتم التواصل معك فيها فعندما يقوم فريق الدعم بالرد سيظهر الرد هناك بحيث تستطيع أيضا الرد ثانيةً بالتوفيق
  15. مرحباً عبد العزيز .. لا شك أن لغة الجافا سكربت لغة عميقة و مجالاتها عديدة و إحترافها ليس شيئاً سهلاً. قناة الزيرو قناة غنية و محتواها مفيد جداً و دورات الجافا سكربت التي يقدمها الأخ أسامة إبتداءً من أساسيات اللغة إلى DOM ثم ال BOM كافية للبناء المعرفي للغة لكن تطبيق المفاهيم و دمجها مع بعض لحل المشاكل أو التمارين التي تواجهك هذه مهارة أخرى تكتسبها مع الوقت لأن كل شخص و كيف يُفكر و المشكلة لديها عدة حلول برمجية أي هناك عدة طرق للوصول إلى الحل . في بداية الأمر قد لا يستطيع الشخص توظيف ما تعلمه من مفاهيم لحل مشكلة ما و هذا شيء طبيعي لكن بالممارسة أكثر و رؤية حلول كثيرة و بالبحث سيُكون الشخص هذه المهارة . ما عليك فعلهه هو مشاهدة الدروس و التطبيق عليها . إبحث عن مشاكل. لحلها تحتاج فقط المفاهيم التي درستها و ليس مفاهيم متقدمة لم تدرسها بعد حاول توظيف ما تعلمته لحل هذه المشاكل إن لم تستطع حلها بنفسك إبحث عن كيفية توظيف ما تعلمته مثلا لحل هذه المشكلة لا تشاهد الحل مباشرة بعد القيام بهذه المراحل إذا لم تجد حل أو لم تستطع إيجاد كيفية الحل قم بمشاهدة الحل لأن هذا الشيء سيُعلمك و مستواك سيتطور أكثر بعد تعلم أساسيات اللغة و ال DOM بالإضافة إلى ال BOM و التطبيق عليها إنتقل إلى تعلم الإصدارات الحديثة من جافاسكربت es6 و مافوق و ستجد قائمة لها في قناة الزيرو و بعدها إنتقل إلى البرمجة الكائنية أو غرضية التوجه بلغة الجافا سكريبت و بهذا تكون قد قطعت شوطا كبيراً يُنصح كثيرا بتعلم مكتبة jQuery قبل تعلم es6 و أخيراً أنصحك بتعلم أحد أطر عمل اللغة ك React.js Vue.js Angular بالتوفيق