لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 05/14/24 في كل الموقع
-
السلام عليكم ان دارست عن ال Series بس برد يعني مش فاهم اي هي مميزاتها ؟ وكمان هل هي عبار عن قاموس ؟ وهل ممكن اطبق علها عملي من خلال بيانات كبير شوي وكده؟2 نقاط
-
السلام عليكم ليه بيظهر خطاء في الكود ده import pandas as pd arr0 = pd.Index([0,1,2,3,4]) arr1 = pd.Index([0,1,2]) print(arr0 & arr1)2 نقاط
-
السلام عليكم عاوز اسألكم يا اخوان شلون اسوي ارسال ايميل باستخدام Gmail بالجانغو ابغى تساعدوني بشرح او خطوات اسويها للي مارق عليه هذا الشي2 نقاط
-
انا اقوم بعمل تطبيق ويب لحجز صالات المناسبات و اريد ان ابدا ببناء قاعدة البيانات و لكن الحيره هنا في ايهما سأستخدم mangodb و mysql و ميزات كل واحده منهما و ايضا اسعار الاستضافه مثل godaddy قواعد mysql مجانيه علي خلاف mangodb فهل سأستطيع ان اجد مشتضيف مجاني لقواعد mangodb1 نقطة
-
1 نقطة
-
يظهر هذا الخطا عند طلب الصور من المشروع upstream image response failed for https://api.wesamelnagah.com/api/public/images/1715322534151.jpg app.js1 نقطة
-
public_html.zipالسلام عليكم اني صممت هذا الموقع واريد https://samabludan.com. لكن الموقع جدا بطيء اتمنى واحد يطيني رائيه لان اهواي سئلت ومحد اطه جواب اني اشتركت بالكورس لهدف المساعده وايضا راح اضيف ملفات الموقع واتمنى اتشوفوه وتعرضون الموقع حتى اعرف وين خطاي واعالجه public_html.zip1 نقطة
-
السلام عليكوم ورحمة الله و بركاته ،اخواني في الله احتاج كيفية برمجة سوفتوير الرسيفر علما اني امتلك التعريفات الازمة مثل البوت و الاشارة و المداخل إلخ... انا بعد البحث علمت ان السوفت يمكن تعديلة من خلال برنامج hex على الكمبيوتر لكن البرمجة لا اعرف كيف يمكنني البرمجة و دمج التعريفات و انا لا املك الخبرة الازمة فهل من مساعد.1 نقطة
-
Series عبارة عن نوع بيانات خاص في pandas مخصص لتمثيل البيانات ذات المحاور (مثل السلاسل الزمنية) لكن القواميس نوع بيانات عام في Python لتمثيل مجموعات البيانات ذات المفاتيح والقيم. وتُنظم البيانات في Series بمحورين هما المحور الرئيسي (index) والقيم بينما في القواميس باستخدام المفاتيح والقيم فقط. يوجد في Series مجموعة واسعة من الوظائف المخصصة لتحليل البيانات ومعالجتها، مثل التصفية والفرز والتجميع، وتم تصميمها للتعامل مع مجموعات البيانات الكبيرة بكفاءة عالية، باستخدام خوارزميات محسّنة لتحليل البيانات. في حين تفتقر القواميس إلى مثل تلك الوظائف المخصصة، وتتطلب استخدام مكتبات خارجية أو كتابة أكواد مخصصة للتعامل مع البيانات بشكل متقدم، وهي أقل كفاءة عند التعامل مع مجموعات البيانات الكبيرة، خاصةً عند إجراء عمليات تحليلية معقدة.1 نقطة
-
دالة Series في مكتبة Pandas تشبه القاموس في بايثون لكنها تحتوي على بعض المميزات الخاصة بها، وتتميز بأنها تتيح فهرسة كل عنصر بفهرس يمكن أن يكون رقميا أو نصيا، وجميع العناصر فيها تكون من نفس النوع. يمكن إجراء العمليات الرياضية والإحصائية بسهولة كما تتكامل بشكل ممتاز مع مكتبات تحليل البيانات الأخرى مثل Numpy. Pandas عامة و Series خاصة مصممة للتعامل مع مجموعات بيانات كبيرة وعمليات تحليل معقدة بشكل فعال. الفروقات بين Series والقاموس تكمن في أن Series تتيح إجراء العمليات الرياضية والإحصائية بسهولة ويمكن فهرستها بأي نوع من القيم، في حين أن القاموس يمكن أن يحتوي على أنواع بيانات مختلفة ولكنه لا يدعم العمليات الرياضية بشكل مباشر.فلإنشاء Series من قائمة بيانات: import pandas as pd data = [1, 2, 3, 4, 5] s = pd.Series(data) print(s) كما يمكنك إجراء عملية جمع على جميع العناصر هكذا: print(s + 10) يمكن الوصول إلى عنصر معين: print(s[2]) يمكنك التوسع في الموضوع من هنا:1 نقطة
-
1 نقطة
-
يمكنك التحقق من توثيق المكتبة أو محاولة استخدام الكود مباشرة ومعرفة ما إذا كان يظهر خطأ. import pandas as pd print(pd.__version__) أو من خلال زيارة الموقع الرسمي للتوثيق `pandas` [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/) والبحث عن توثيق `pd.Index` ومراجعة العمليات المدعومة عليه.لكن يوجد بديل آخر، بحيث يمكنك استخدام دالة `union` كطريقة مؤكدة: import pandas as pd arr0 = pd.Index([0, 1, 2, 3, 4]) arr1 = pd.Index([0, 1, 2]) print(arr0.union(arr1)) فدالة `union` تعتبر الخيار الأكثر أمانا للعمل مع إصدارات مختلفة من `pandas`.1 نقطة
-
تمام بس برد بيظهر خطاء فا ممكن يكون ده كمان مش مدعوم دلوقتي فا ازي اعارف ان ده مدعوم او مش مدعوم1 نقطة
-
العفو، بالنسبة للعامل `|` يمكن استخدامه لعمل اتحاد بين كائنات `pd.Index` في مكتبة `pandas`. ففي حالة ما إذا كانت تواجهنا مشاكل مع استخدام العامل `&` للتقاطع، يمكن استخدام `|` للاتحاد بهذه الطريقة: import pandas as pd arr0 = pd.Index([0,1,2,3,4]) arr1 = pd.Index([0,1,2]) print(arr0 | arr1) فهذه الطريقة ستعطينا اتحاد المؤشرين، مما يعني دمج جميع العناصر مع إزالة التكرارات كما أن كلتا الطريقتين ستعطيك نفس النتيجة، وهي اتحاد العناصر في المؤشرين.1 نقطة
-
وكمان ازي استخدم دي | شكرااا لحضرتك جدا بس في العامل ده (|) ازي استخدم1 نقطة
-
صحيح، التقاطع (`&`) بين كائنات `pd.Index` كان مدعوما في إصدارات أقدم من مكتبة `pandas`. ومع التحديثات الجديدة، قد تكون هذه العملية لم تعد مدعومة بنفس الطريقة. ولضمان التوافق مع الإصدارات الأحدث من المكتبة، يفضل استخدام الدوال المخصصة مثل `intersection`.1 نقطة
-
تمام بس هي كانت بتدعم اصل في فيديو علي الينيوب مستخدمها عادي يتيوب1 نقطة
-
الخطأ الذي يظهر عند تشغيل هذا الكود يرجع إلى أن عملية التقاطع (`&`) غير مدعومة مباشرة بين كائنات `pd.Index` في مكتبة `pandas`. لاستخدام عملية التقاطع بين مجموعتين من المؤشرات، يجب استخدام الدالة `intersection` بدلا من ذلك. إليك الكود المعدل: import pandas as pd arr0 = pd.Index([0,1,2,3,4]) arr1 = pd.Index([0,1,2]) print(arr0.intersection(arr1)) فهذا الكود سيعطيك التقاطع الصحيح بين المؤشرين `arr0` و `arr1`.1 نقطة
-
1 نقطة
-
ماهي Microservices وكيف تتجلى فائدها لفريق العمل البرمجي على موقع مثلا ؟؟ وماهي البرامج التي تقدم مثل هذه الخدمة شكرا...1 نقطة
-
قبل البدء بالتفاصيل التقنية، لنتكلم قليلا لماذا ومتى نحتاج إلى اتصالات قاعدة بيانات متعددة في تطبيق Laravel الخاص بنا ؟ - تطبيق مبدأ فصل الاهتمام: فغالباً ما تنتمي البيانات المختلفة إلى مجالات أو خدمات مختلفة. - تحسين الأداء: من خلال توزيع بياناتك عبر قواعد بيانات متعددة، يمكنك تحسين أداء قاعدة البيانات. فعلى سبيل المثال، يقوم البعض باستخدام قاعدة بيانات مخصصة للعمليات الثقيلة للقراءة وأخرى للعمليات الثقيلة للكتابة. - عمليات تكامل الجهات الخارجية: في بعض الأحيان، قد تحتاج إلى الاتصال بقواعد بيانات خارجية أو قديمة لا تتوافق مع مخطط قاعدة البيانات الأساسية. تمكنك الاتصالات المتعددة من العمل مع مصادر البيانات هذه بكفاءة. - في تطبيقات التي تقدم خدمة بالاجار تسمى SAAS وخاصة في حالة تريد فصل بيانات المستخدمين عن بعضهم البعض حيث تكون الواجهة واحدة ولكن بقواعد بيانات مخصصة لكل عميل حيث تسمى هذه الهيكلية بMulti-Tenancy والآن سأقوم بشرح الخطوات لتحقيق ذلك: 1. يجب إعداد قواعد البيانات التي أريد التعامل معها: لإعداد اتصالات قاعدة بيانات متعددة نحتاج لتعريف كل اتصال منها في ملف config/database.php: // config/database.php 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'default'), 'username' => env('DB_USERNAME', 'default'), 'password' => env('DB_PASSWORD', ''), // ... ], 'second_db' => [ 'driver' => 'mysql', 'host' => env('SECOND_DB_HOST', '127.0.0.1'), 'port' => env('SECOND_DB_PORT', '3306'), 'database' => env('SECOND_DB_DATABASE', 'second'), 'username' => env('SECOND_DB_USERNAME', 'second'), 'password' => env('SECOND_DB_PASSWORD', ''), // ... ], // يمكنك الإضافة بقدر ما تشائين من الاتصالات بقواعد البيانات هنا ], في هذا المثال، حددنا اتصالين بقاعدة البيانات: "mysql" (الاتصال الافتراضي) و"second_db". يمكنك إضافة المزيد من الاتصالات كما هو مطلوب، ولكل منها تكوينها الخاص.2. تعيين متغيرات البيئة: للحفاظ على أمان بيانات الوصول لقاعدة البيانات، يجب الالتزام باستخدم ملف .env لتخزينها. لذلك يجب تعيين متغيرات البيئة لكل اتصال قاعدة بيانات قمنا بانشائه كما يلي: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=your_database DB_USERNAME=your_username DB_PASSWORD=your_password SECOND_DB_CONNECTION=mysql SECOND_DB_HOST=127.0.0.1 SECOND_DB_PORT=3306 SECOND_DB_DATABASE=second_database SECOND_DB_USERNAME=second_username SECOND_DB_PASSWORD=second_password وتأكد من تطابق أسماء متغيرات البيئة مع تلك المعرفة في config/database.php. 3. نقوم بإنشاء النماذج (models): مثلاً هنا سأقوم بإنشاء نموذج لكل قاعدة بيانات: php artisan make:model User -m php artisan make:model Product -m يقوم هذا الأمر بإنشاء ملفات النموذج وملفات الترحيل (migrations) لكل نموذج. 4. تحديد الاتصال في ملفات النموذج التي تم إنشاؤها: // app/Models/User.php protected $connection = 'mysql'; // app/Models/Product.php protected $connection = 'second_db'; 5. تشغيل عمليات الترحيل (migrate) الآن، يمكنك تشغيل عمليات الترحيل لكل اتصال على حدة: php artisan migrate php artisan migrate --database=second_db سيؤدي هذا إلى إنشاء الجداول اللازمة في قواعد البيانات الخاصة بكل منها.الآن أصبح كل نموذج يتعامل مع قاعدة بيانات مختلفة: فمثلاً للتأكد يمكنك الآن الاستعلام عن البيانات من قواعد بيانات متعددة باستخدام نماذج كل قاعدة بيانات. وفيما يلي مثال على كيفية استرداد المستخدمين والمنتجات من قاعدتي البيانات لدينا: use App\Models\User; use App\Models\Product; // Retrieve users from the 'mysql' database $users = User::all(); // Retrieve products from the 'second_db' database $products = Product::all(); وهنا يتولى لارافل مهمة توجيه استعلاماتك إلى قاعدة البيانات الصحيحة بناء على خاصية اتصال النموذج التي قمنا بوضها في كل نموذج.1 نقطة
-
نعم، في إمكانك توصيل مشروع لارافل بأكثر من قاعدة بيانات بكل سهولة. ساشرح لك الخطوات بالتفصيل: 1. تعديل ملف الإعدادات .env: - أول شئ ستفعله هي إضافة إعدادات الاتصال للقواعد البيانات المختلفة في ملف .env الخاص بمشروعك. مثلاً، لو عندك قاعدتين بيانات، واحدة اسمها db1 والتانية db2، هتضيف إعدادات زي الأتي: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=main_database DB_USERNAME=root DB_PASSWORD= DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=second_database DB_USERNAME_SECOND=root DB_PASSWORD_SECOND= 2. تعديل ملف config/database.php: - بعد ما تضيف الإعدادات في .env، الان يجب الذهاب لملف config/database.php عشان تضيف الاتصالات الجديدة تحت الـ connections array: 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'second' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL_SECOND'), 'host' => env('DB_HOST_SECOND', '127.0.0.1'), 'port' => env('DB_PORT_SECOND', '3306'), 'database' => env('DB_DATABASE_SECOND', 'forge'), 'username' => env('DB_USERNAME_SECOND', 'forge'), 'password' => env('DB_PASSWORD_SECOND', ''), 'unix_socket' => env('DB_SOCKET_SECOND', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA_SECOND'), ]) : [], ], 3. استخدام الاتصال بالقاعدة المطلوبة في كودك: يمكنك صنع جدول لقاعدة البيانات عبر Schema بحيث نعرف Schema::connection لقاعدة البيانات الأخرى مثل Schema::connection('second')->create('users_two', function($table) { $table->increments('id'): }); لما تحب تستخدم قاعدة بيانات معينة في أي استعلام بالكود، تقدر تحدد الاتصال عن طريق الاسم اللي حددته. مثلاً، لو عايز تجيب بيانات من القاعدة الثانية: $users = DB::connection('second')->select(...); ايضا يمكنك توجيه Model إلى استخدام قاعدة الاتصال الثاني الخاص بقاعدة البيانات الثانية باستخدام protected $connection = 'second';1 نقطة
-
نعم ذلك ممكن عن طريق اجراء بعض التعديلات في ملف config/database.php بحيث ان كل نموذج Model من نماذج لارافيل يحتوي على الخاصية connection والتي عادة ما تكون مظبوطة على قاعدة البيانات الافتراضية المضمنة الان ستقوم باضافة تعريف لقاعدة البيانات الموجودة لديك كالتالي 'sqlite2' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], sqlite هو اسم قاعدة البيانات يمكنك استبدالها بالاسم الموجود لديك وبالتالي اصبح بامكانك استخدام اسم الاتصال الذي قمت بتعريفه في ملف database.php لتحديد أي قاعدة بيانات تريد التواصل معها كالتالي $users = DB::connection('sqlite2')->select(...); والان سنقوم باسنادها كقيمة ل connection في ملف النموذج المستهدف class User extends Model { protected $connection = 'sqlite2'; } وبالتوفيق لك ...1 نقطة
-
هل أنت مهتم بتعلم البرمجة والتطوير لكنك تتساءل ما هي مدة تعلم البرمجة؟ وكم أحتاج من الوقت لتعلم لغة برمجة معينة، وهل سأستغرق وقتًا طويلًا لتعلمها والعمل بها؟ وفي مقال اليوم نحاول أن نجيبك على كل هذه الأسئلة ونقدم بعض النصائح المفيدة التي تساعدك على التقدم بشكل أسرع. في الواقع قد تختلف الإجابة على هذا السؤال اعتمادًا على عدة عوامل مثل الوقت الذي يمكنك توفيره لدراسة البرمجة يوميًا ومدى استيعابك، وهل تبدأ من الصفر أم لديك بعض المعلومات المسبقة عن البرمجة، وما هو المجال أو التخصص الذي ترغب بتعلمه كم يستغرق تعلم البرمجة دعنا نتفق أنه ليس من السهل تحديد جواب دقيق لهذا السؤال، جرب مثلًا أن تكتب في محرك البحث جوجل "كم يستغرق تعلم البرمجة" ستفاجئ بالحصول على إجابات متفاوتة بشكل كبير على هذا السؤال قد تتراوح من ثلاثة أشهر إلى خمس سنوات! يعزى هذا التفاوت الكبير في الإجابات إلى وجود عوامل عديدة تلعب دورًا في تحديد مدة تعلم البرمجة، بعض هذه العوامل فردية وتختلف من شخص لآخر فهناك أشخاص يتعلمون المفاهيم الجديدة أسرع من غيرهم، وبعضهم لديه متسع من الوقت يمكن تخصيصه يوميًا في دراسة البرمجة أكثر من غيره، وبعضها الآخر عوامل تتعلق بطبيعة لغة البرمجة التي تنوي تعلمها أو التخصص البرمجي التي تود تعلمه وهل ترغب بالتعلم لدخول سوق العمل أم لمجرد اكتساب مهارات شخصية فكل هذه العوامل تؤثر على وتيرة تعلمك وزمن تحقيق أهدافك. سنناقش في الفقرات التالية بعض العوامل المهمة التي تؤثر على مدة تعلم البرمجة ونوضح كم يستغرق تعلم البرمجة بناء على كل حالة من الحالات لنساعدك على تحديد الوقت المطلوب بشكل تقريبي بحسب حالتك. العوامل التي تؤثر على مدة تعلم البرمجة الخبرة المسبقة صعوبة لغة البرمجة المستوى الذي تطمح للوصول إليه التخصص أو المجال البرمجي أسلوب التعلم جودة مصادر التعلم الخبرة المسبقة فإذا كنت تنوي تعلم البرمجة من الصفر ولم يكن لديك أي خلفية تقنية وليس لديك أدنى فكرة عن مبادئ التعامل مع الحاسوب ومفهوم الخوارزميات وأسس التفكير المنطقي وحل المشكلات وعن أي لغة برمجة سابقة فسيستغرق تعلم البرمجة وقتًا طويلاً منك نظرًا لوجود مجموعة واسعة من المفاهيم التي عليك تعلمها وقد يستغرق الأمر عدة أشهر حتى تتمكن من كتابة استيعاب أساسيات البرمجة وفهم مفردات لغة البرمجة التي تستخدمها وكتابة برنامج الأول بها بنفسك وتنفيذه بشكل صحيح. من الضروري أن لا تشعر بالإحباط في بدايات تعلم البرمجة وتأسيس نفسك بها فالبدايات دومًا هي الأصعب فإذا تخطيت هذه المرحلة فستتمكن من التقدم بتعلم البرمجة بوتيرة أسرع وسيسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. صعوبة لغة البرمجة أحد العوامل المهمة في زمن تعلم البرمجة هو اللغة التي تختارها فهناك العديد من لغات البرمجة المختلفة مثل لغة بايثون Python. وجافا Java و C++ و PHP وغيرها الكثير وبعض هذه اللغات سهل التعلم وبعضها الآخر أكثر صعوبة ويستغرق مدة تعلم أطول فتعلم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر وستحتاج لوقت أكبر إذا كنت تتعلم لغة برمجة صعبة. لذا عندما تقرر تعلم البرمجة فمن الأفضل أن تبحث عن لغة لها منحنى تعلم "Learning Curve" سهل وغير حاد أو معقد، ومنحنى التعلم هو طريقة بيانية للتعبير عن صعوبة تعلم الشخص لموضوع خلال فترة زمنية معينة ويعبر عن سرعة التقدم والخبرات المكتسبة في هذا الموضوع مع مرور الوقت. على سبيل المثال تملك لغة بايثون Python منحنى تعليمي أسهل من لغة جافا Java بسبب تعتبر لغة تركيبتها التي تشبه إلى حد كبير اللغة الإنجليزية وقواعدها السهلة، لهذا السبب فإن مدة تعلم لغة البايثون ستكون أقصر من مدة تعلم لغة جافا وتقدر المدة الوسطية لتعلم أساسيات بايثون بخمس إلى عشر أسابيع في حين تصل مدة تعلم جافا من ستة أشهر إلى 18 شهرًا، ويمكنك مطالعة المزيد من المعلومات حول لغات البرمجة التي يفضل أن تبدأ بها تعلم البرمجة من خلال مقال أسهل لغات البرمجة. المستوى الذي تطمح للوصول إليه إذا كنت تقصد عند سؤالك ما المدة التي أحتاجها لتعلم البرمجة أن تتعلم أساسيات البرمجة وتتعرف على طريقة أسلوب كتابة الشيفرات والتعليمات وتعريف المتغيرات وأنواع البيانات، والحلقات والشروط والدوال البرمجية …إلخ. لمجرد اكتساب مهارة تنمي تفكيرك المنطقي والتحليلي وتوسع مداركك وتمكنك من كتابة برامج حاسوبية لحل مشكلات بسيطة أو أتمتة مهامك اليومية المتكررة فهذا الأمر لن يتطلب منك سوى ثلاثة إلى ستة أشهر فقط لتعلم البرمجة بأي لغة كانت. لكن هذه المدة لن تكون كافية لك لاحتراف البرمجة ودخول سوق العمل فهذا الأمر قد يتطلب منك حوالي سنة أو أكثر للعمل على بناء برامج معقدة وتطبيقات احترافية متكاملة تتعامل مع مشكلات فعلية وتنبي من خلالها معرض أعمال جيد يعزز فرصتك في الحصول على عمل مناسب وإذا كنت تحتاج علم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر. التخصص أو المجال البرمجي إن مجالات البرمجة كثيرة ومتنوعة مثل تطوير الويب وبرمجة المواقع وبرمجة الألعاب والذكاء الاصطناعي وعلوم البيانات والأمن السيبراني وغيرها الكثير وبتطلب كل تخصص برمجي مجموعة مهارات مختلفة عن الآخر فكلما زادت المهارات المطلوبة وزاد تعقيدها، كلما زاد الوقت الذي تحتاجه لتعلمها. على سبيل المثال، تبلغ مدة تعلم برمجة المواقع حوالي ستة أشهر إلى عام واحد، في حين يحتاج تعلم أساسيات الذكاء الاصطناعي مدة أطول قد تصل لسنة أو أكثر لأنه مجال أكثر تعقيدًا ويتطلب وجود أساس جيد في الرياضيات والإحصاء ويحتج بعض الوقت للتآلف مع مصطلحاته والتعرف على تخصصاته المختلفة وتعلم خوارزميات التعلم الآلي ولغات برمجة الذكاء الاصطناعي كما يحتاج للكثير من الممارسة لإتقانه. أسلوب تعلم البرمجة تختلف مدة تعلم البرمجة أيضًا بحسب الطريقة التي تختارها للتعلم، فإذا اخترت دارسة البرمجة عن طريق التعليم الأكاديمي والتسجيل في إحدى الجامعات فستستغرق وقتًا طويلًا لا يقل عن أربع أو خمس سنوات لأنك ستضطر على الالتزام بمنهج محدد. أما إذا اخترت التعلم الذاتي فستتمكن من توفير الكثير من الوقت وتقتصر اعلى لغات البرمجة والتقنيات التي تحتاج لتعلمها وبقدر ما تثابر وتبذل من جهد وتلتزم بخطة تعلم منظمة وساعات تعلم محددة يوميًا فستختصر من زمن تعلم البرمجة وتتمكن من دخول سوق العمل بسرعة أكبر. جودة مصادر التعلم إذا قررت تعلم البرمجة فستجد الكثير من مصادر التعلم المتنوعة من دروس ومقالات وكتب ومقاطع فيديو ودورات تدريبية وغيرها من المصادر التي تساعدك لكن هذه المصادر ليست على نفس المستوى من الجودة وقد يصعب عليك كمبتدئ تمييز الغث من السمين وتحديد الترتيب الصحيح لمواضيع التعلم والتركيز على تعلم ما يهمك. كما أن تعلمك من مصادر مشتتة وبطريقة عبثية فتارة تشاهد مقطع فيديو عن موضوع ما وتارة تقرأ مقالة عن موضوع آخر وتارة تبدأ بقراءة كتاب ثم تمل منه سريعًا سيزيد بلا شك من مدة تعلم البرمجة وتحقيق هدفك وتذكر أن المشتت لا يصل. فإذا كنت تتعلم البرمجة دون خطة منهجية واضحة وتريد اختصار وقت تعلم البرمجة فمن الأفضل أن تستثمر وقتك وجهدك وتسجل في دورة تدريبية المنهجية التي تقدم لك المعرفة التي تحتاجها بالتسلسل الصحيح وتوضح لك الأدوات والتقنيات التي تحتاجها وتقيم مهاراتك بشكل معياري وتساعدك على تنفيذ تطبيقات عملية تعزز ما تعلمته وتزيد فرصتك في الحصول على وظائف برمجة مناسبة لمهاراتك. ستجد في أكاديمية حسوب الكثير من الدورات التعليمية عالية الجودة بمختلف التخصصات توفر لك إمكانية التعلم من الصفر دون الحاجة لأي معرفة مسبقة وتساعدك على التعلم بطريقة منظمة وتقرن التعليم النظري بالتطبيق العملي والأهم أنها توفر لك مدربين خبراء يرشدونك ويدعمونك طوال رحلتك التعليمية ويساعدونك في الإجابة على أي تساؤل وحل أي مشكلة تواجهك ويسعدون بتقديم المشورة التي تحتاجها حتى تحترف البرمجة وتجد فرصة العمل المناسبة. هل فات الوقت على تعلّم البرمجة كثيرًا ما نسمع أسئلة من قبيل أنا مهتم بالبرمجة والتقنية وأرغب في تعلمها لأعمل في وظيفة أفضل وذات مردود مادي أعلى أو أرغب بتعلم البرمجة لمواكبة التطور التقني وتعزيز مهارات حل المشكلات لدي ولكن عمري (كذا سنة) فهل فات الوقت على تعلم البرمجة؟ دعني أخبرك بأنه مهما كان عمرك فإن الأوان لم يفت على تعلم البرمجة فالعمر لا يشكل أي عائق في التعلم سواء في ظل وفرة الموارد المتاحة لمساعدتك. وقد يستغرق تعلم البرمجة مدة أطول مع التقدم في السن لكنك قادر على تقليل هذه المدة في حال خصصت وقتًا أطول وأسست نفسك بشكل جيد بالاعتماد على مصادر عالية الجودة وامتلكت الإرادة والرغبة الحقيقية للتعلم فهذا كفيل بجعلك تتغلب على أي صعوبات أو عوائق تواجهها. نصائح لتقليل مدة تعلم البرمجة حدد هدفك من تعلم البرمجة والتخصص البرمجي المناسب لك، وضع خطة لتعلم التقنيات واللغات التي تفيدك في هذا التخصص. عزز مهارة حل المشكلات والتفكير المنطقي قبل البدء بالبرمجة فهي مهارات أساسية تقلل مدة تعلم البرمجة. ركز على تعلم لغة برمجة سهلة وتناسب المبتدئين فهذا يسهل عليك استيعاب المفاهيم البرمجية بوقت أقل ويسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. لا تستسلم بسرعة، فتعلم أي شيء جديد سيكون صعبًا في البداية ويستغرق بعض الوقت لفهم الأساسيات ومع الوقت والخبرة تصبح الأمور أسهل. اعتمد على مصدر جيد لتعلم البرمجة ولا تشتت نفسك بكثرة المصادر. احرص على التطبيق العملي لما تتعلمه من مفاهيم فهذا يعزز مهاراتك ويساعدك على بناء معرض أعمال يثبت خبرتك. تعلم مع أصدقاء لديهم نفس اهتمامك وضع معهم هدفًا مشترك وخطة للتعلم وتعاون معهم في حل المشكلات وتعلم المفاهيم الجديدة فهذا يجعل التعلم أكثر متعة ويحفزك على المواصلة. الخلاصة نأمل أن يكون هذا المقال قد ساعدك في تحديد كم يستغرق تعلم البرمجة ومعرفة أهم العوامل التي تلعب دورًا في الإجابة على هذا السؤال بشكل تقريبي، وكما وضحنا في المقال لا يوجد جواب واحد يناسب الجميع على هذا السؤال لكن بإمكانك اختصار مدة تعلم البرمجة ودخول سوق العمل بسرعة بالمثابرة والجهد. وتذكر في الختام أن البرمجة تحتاج منك إلى الاستمرار في التعلم وتطوير نفسك حتى بعد الاحتراف ودخول سوق العمل، فالتقنيات تتغير وتتطور باستمرار ومن الضروري مواكبة هذه التغييرات وتطبيقها في عملك للحفاظ على مكانتك التنافسية وتلبية متطلبات سوق العمل المتجددة. اقرأ أيضًا دليل شامل لتعلم البرمجة قواعد البرمجة ببساطة للمبتدئين اكتشف ما هي البرمجة وما أهمية تعلمها برمجة الحاسوب للمبتدئين لماذا يجب أن تعلم طفلك البرمجة؟1 نقطة
-
ادعنا نبدأ رحلتنا مع لغة رست، إذ هناك الكثير لنتعلمه، وعلى كل رحلة أن تبدأ في مكان ما. سنناقش في هذا المقال كلًا من التالي: تثبيت لغة رست على لينكس Linux وماك أو إس macOS وويندوز Windows. كتابة برنامج يطبع العبارة "Hello, world!". استخدام أداة كارجو cargo، مدير حزم لغة رست package manager ونظام بنائها build system. تثبيت لغة رست أولى خطواتنا هنا هي تثبيت لغة رست هي بتنزيل رست عن طريق أداة سطر الأوامر rustup، التي تدير إصدارات رست والأدوات المرتبطة بها، وستحتاج لاتصال بالإنترنت لهذه الخطوة. ملاحظة: إذا كنت لا تفضل استخدام rustup لسبب ما، اطّلع على هذه الصفحة للمزيد من الخيارات لتثبيت لغة رست. تثبّت الخطوات التالية آخر إصدارات لغة رست المستقرة، ويضمن لك ثبات رست تصريف جميع الأمثلة الموجودة في هذه السلسلة حتى مع الإصدارات القادمة الجديدة، إلا أنه قد يختلف الخرج قليلًا بين الإصدارات، وذلك بسبب تطوير لغة راست على رسائل الخطأ والتحذيرات. بكلمات أخرى: سيعمل أي إصدار جديد ومستقر من لغة رست تثبّته باتباع الخطوات التالية كما هو متوقع منه ضمن محتوى هذه السلسلة. الإشارة إلى سطر الأوامر سنستعرض بعض الأوامر المُستخدمة في الطرفية terminal ضمن هذا المقال والسلسلة ككُل، إذ تبدأ الأسطر التي يجب أن تُدخلها بالرمز "$"، وليس عليك هنا أن تكتب الرمز "$"، الذي يدل على بداية أمر جديد، وعادةً ما تعرض الأسطر التي لا تبدأ بهذا الرمز الخرج لأمر سابق. إضافةً لما سبق، تستخدم الأمثلة التي تعتمد على صدفة Shell PowerShell خصوصًا الرمز "<" بدلًا من "$". تثبيت أداة سطر الأوامر rustup على لينكس أو ماك أو إس إذا كنت تستخدم نظام لينكس أو ماك أو إس، افتح الطرفية لإدخال الأمر التالي: $ curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh سينزّل الأمر السابق سكريبتًا script ويبدأ بتثبيت أداة rustup التي ستثبّت بدورها آخر إصدارات لغة رست المستقرة، وقد يُطلب منك كلمة المرور لحسابك. إذا انتهت عملية التثبيت بنجاح، ستجد السطر التالي: Rust is installed now. Great! ستحتاج أيضًا إلى رابط linker، وهو برنامج يستخدمه رست لضمّ الخرج المُصرَّف إلى ملف واحد، وسيكون موجودًا غالبًا لديك. يجب عليك تثبيت مصرف سي C الذي يتضمن عادةً على رابط، إذا حصلت على أخطاء رابط، كما أن مصرف سي مفيد أيضًا لاعتماد بعض حزم لغة راست الشائعة على شيفرة لغة سي. يمكنك الحصول على مصرف سي على نظام ماك أو إس بكتابة الأمر التالي: $ xcode-select --install يجب أن يثبت مستخدمو نظام لينكس GCC أو Clang اعتمادًا على توثيق التوزيعة distribution؛ فإذا كنت تستخدم مثلًا توزيعة أوبنتو Ubuntu، فيمكنك تثبيت حزمة build-essential. تثبيت أداة سطر الأوامر rustup على ويندوز إن كنت تستخدم نظام ويندوز، اذهب إلى www.rust-lang.org/tools/install، واتبّع التعليمات لتثبيت لغة رست، إذ ستستلم في مرحلة ما من مراحل التثبيت رسالةً مفادها أنك ستحتاج إلى أدوات بناء C++ الخاصة ببرنامج فيجوال ستوديو Visual Studio إصدار 2013 أو ما بعده، والطريقة الأسهل في الحصول على أدوات البناء هذه هي بتثبيتها مباشرةً من Visual Studio 2022، وتأكد من اختيار "C++ build tools" عند سؤالك عن أي الإصدارات التي تريد تثبيتها وتأكد أيضًا من تضمين حزمة Windows 10 SDK وحزمة اللغة الإنجليزية إلى جانب أي حزمة لغة أخرى من اختيارك. يستخدم باقي الكتاب أوامر تعمل في كلٍّ من "cmd.exe" وصدفة PowerShell، وإذا كانت هناك أي فروقات معينة سنشرح أيهما يجب أن تستخدم. التحديث والتثبيت في لغة رست تُعد عملية التحديث بعد تثبيت لغة رست باستخدام rustup عمليةً سهلة، فكل ما يجب عليك فعله هو تنفيذ سكريبت التحديث من الصدفة: $ rustup update لإزالة تثبيت لغة رست وأداة rustup، نفذ سكريبت إزالة التثبيت من الصدفة: $ rustup self uninstall استكشاف الأخطاء وإصلاحها في لغة رست للتأكد من أنك أنهيت عملية تثبيت لغة رست بنجاح، افتح الصدفة وأدخل السطر التالي: $ rustc --version من المفترض أن تجد رقم الإصدار وقيمة الإيداع المُعمّاة commit hash وتاريخ الإيداع لآخر إصدار مستقر جرى إطلاقه بالتنسيق التالي: rustc x.y.z (abcabcabc yyyy-mm-dd) إذا ظهر لك السطر السابق، فهذا يعني أنك ثبّتتَ لغة رست بنجاح؛ وإذا لم تجد هذه المعلومات وكنت تستخدم نظام ويندوز، فتأكد أن راست موجود في متغير النظام system variable المسمى %PATH%كما يلي: إذا كنت تستخدم نظام تشغيل ويندوز، اكتب في واجهة سطر أوامر CMD ما يلي: > echo %PATH% أما في صدفة PowerShell، استخدم السطر التالي: > echo $env:Path وفي نظام تشغيل لينكس وماك أو إس، استخدم: $ echo $PATH إذا كان كل شيء صحيحًا، ورست لا يعمل فهناك عددٌ من الأماكن التي تستطيع الحصول منها على مساعدة، إذ يمكنك مثلًا طرح مشكلتك في قسم الأسئلة والأجوبة في أكاديمية حسوب أو إن أردت يمكنك التواصل مع فريق لغة رست مباشرة عبر صفحة التواصل. التوثيق المحلي للغة رست يتضمن تثبيت لغة رست أيضًا نسخةً محليةً من التوثيق documentation لتتمكّن من قراءتها دون اتصال بالإنترنت، ولفتح النسخة ضمن المتصفح، نفذ الأمر rustup doc. استخدم توثيق الواجهة البرمجية في كل مرة تصادف نوعًا أو دالةً في المكتبة القياسية ولست متأكدًا ممّا تفعل أو كيف تستخدمها. كتابة أول برنامج بلغة رست الآن، وبعد الانتهاء من تثبيت لغة رست، يمكنك كتابة أول برنامج. من المتعارف عليه عند تعلم لغة برمجة جديدة هو كتابة برنامج بسيط يطبع السلسلة النصية "Hello, world!" على الشاشة، لذا دعنا ننجز ذلك. ملاحظة: يفترض هذا الكتاب معرفتك بأساسيات سطر الأوامر، ولا تتطلب لغة رست طريقةً معينةً لكيفية تعديلك أو استخدامك للأدوات أو مكان وجود شيفرتك البرمجية، لذا يمكنك استخدام بيئة برمجية متكاملة integrated development environment -أو اختصارًا IDE- إذا أردت، ولك الحرية في اختيار ما هو مفضّل لك. هناك العديد من البيئات البرمجية المتكاملة التي تقدم دعمًا للغة راست، ويمكنك تفقّد توثيق البيئة البرمجية المتكاملة التي اخترتها لمزيدٍ من التفاصيل. يحاول فريق تطوير لغة رست مؤخرًا توجيه جهودهم نحو تمكين دعم جيد للبيئات البرمجية المتكاملة عن طريق rust-analyzer. إنشاء مجلد لمشروع بلفة رست ستبدأ بإنشاء مجلد لتخزين شيفرة لغة رست البرمجية، ولا يهمّ المكان الذي ستخزن الشيفرة فيه، إلا أننا نقترح إنشاء مجلد "projects" للتمارين والمشاريع الموجودة في هذا الكتاب ضمن المجلد الرئيس home. افتح الطرفية وأدخِل الأوامر التالية لإنشاء مجلد "projects" ومجلد لمشروع "Hello, world!" ضمن المجلد "projects". لمستخدمي نظام لينكس وماك أو إس وصدفة PowerShell على نظام ويندوز، أدخل التالي: $ mkdir ~/projects $ cd ~/projects $ mkdir hello_world $ cd hello_world ولطرفية ويندوز CMD، أدخل التالي: > mkdir "%USERPROFILE%\projects" > cd /d "%USERPROFILE%\projects" > mkdir hello_world > cd hello_world كتابة وتشغيل برنامج بلغة رست أنشئ ملفًا مصدريًا جديدًا وسمّه باسم "main.rs"، إذ يجب أن تنتهي ملفات شيفرة لغة رست بالامتداد ".rs" دائمًا، وإذا كنت تستخدم أكثر من كلمة واحدة في اسم الملف، فاستخدم الشرطة السفلية underscore للفصل ما بين الكلمات، فعلى سبيل المثال استخدم الاسم "hello_world.rs" بدلًا من "helloworld.rs". الآن افتح ملف "main.rs" الذي أنشأته لتوك وأدخِل الشيفرة التالية: fn main() { println!("Hello, world!"); } [شيفرة 1: برنامج يطبع "Hello, world!"] احفظ الملف واذهب مجددًا إلى نافذة الطرفية. أدخل الأوامر التالية لتصريف وتشغيل الملف إذا كنت تستخدم نظام لينكس أو ماك أو إس: $ rustc main.rs $ ./main Hello, world! إذا كنت تستخدم نظام ويندوز أدخل الأمر .\main.exe بدلًا من ./main: > rustc main.rs > .\main.exe Hello, world! يجب أن تحصل على السلسلة النصية "Hello,world!" مطبوعةً على الطرفية بغض النظر عن نظام تشغيلك، وإن لم يظهر الخرج، فعُد إلى فقرة استكشاف الأخطاء وإصلاحها لطرق الحصول على مساعدة. إذا حصلت على السلسلة النصية "Hello, world!"، تهانينا، فقد كتبت رسميًا أولى برامج لغة رست، مما يجعلك مبرمج لغة رست، أهلًا بك. أجزاء برنامج لغة رست دعنا نطّلع بالتفصيل على الأشياء التي تحدث في برنامج "Hello, world!"، إليك أول الأجزاء: fn main() { } تعرّف هذه السطور دالةً في لغة رست، ودالة main هي دالة مميزة؛ إذ أنها نقطة تشغيل الشيفرة البرمجية الأولية في أي برنامج رست تنفيذي. يصرح السطر الأول عن دالة تدعى main لا تمتلك أي معاملات ولا تُعيد أي قيمة، وإذا أردنا تحديد أي معاملات، نستطيع فعل ذلك عن طريق وضعها داخل قوسين "()". لاحظ أيضًا أن متن الدالة محتوًى داخل أقواس معقوصة "{}"، إذ تتطلب لغة رست وجود هذه الأقواس حول متن أي دالة، ويُعد وضع القوس المعقوص الأول على سطر تصريح الدالة ذاته مع ترك مسافة فارغة بينهما تنسيقًا مُحبّذًا. ملاحظة: إذا أردت الالتزام بتنسيق موحّد ضمن جميع مشاريع رست الخاصة بك، يمكنك استخدام أداة تنسيق تلقائية تدعى rustfmt لتنسيق الشيفرة البرمجية بأسلوب معين، وقد ضمّن فريق تطوير لغة رست هذه الأداة مع توزيعة لغة رست القياسية، مثل rustc، لذا من المفترض أن تكون مثبتة مسبقًا على جهازك. نجد داخل دالة main الشيفرة البرمجية التالية: println!("Hello, world!"); يفعل السطر السابق كامل العمل الذي يهدف إليه برنامجنا البسيط، ألا وهو طباعة النص إلى الشاشة وهناك أربع نقاط مهمة بهذا الخصوص يجب ملاحظتها هنا، هي: أولًا، أسلوب لغة رست في التنسيق هو محاذاة السطر indent باستخدام أربع مسافات فارغة وليس مسافة جدولة tab. ثانيًا، تستدعي println! ماكرو رست، وإذا أردنا استدعاء دالة بدلًا من ذلك، فسنستخدم println (أي الاستغناء عن !)، وسنتناقش بخصوص الماكرو في لغة رست بمزيد من التفاصيل في جزئية لاحقة من هذه السلسلة وكل ما عليك معرفته الآن هو أن استخدام ! يعني أننا نستدعي ماكرو بدلًا من الدالة الاعتيادية، وأن الماكرو لا يتبع القوانين ذاتها التي تتبعها الدوال. ثالثًا، السلسلة النصية "Hello, world!" تُمرّر وسيطًا argument للماكرو !println، ثمّ تُطبع السلسلة النصية على الشاشة. رابعًا، نُنهي السطر بالفاصلة المنقوطة (;) وذلك يُشير إلى انتهاء ذلك التعبير expression وأن التعبير التالي سيبدأ من بعده، وتنتهي معظم أسطر شيفرة لغة رست بالفاصلة المنقوطة. تصريف البرنامج وتشغيله في لغة رست لقد شغّلت لتوّك برنامجًا جديد الإنشاء، دعنا ننظر إلى كل خطوة من هذه العملية بتمعّن. قبل تشغيل برنامج رست، يجب عليك تصريفه باستخدام مصرف لغة رست بإدخال الأمر rustc وتمرير اسم الملف المصدري كما يلي: $ rustc main.rs إذا كان لديك معرفة سابقة بلغة C أو C++، فستلاحظ أن هذا مماثل لاستخدام الأمر gcc أو clang. بعد التصريف بنجاح، يُخرج رست ملفًا ثنائيًا تنفيذيًا binary executable. يمكنك رؤية الملف التنفيذي على نظام لينكس أو ماك أو إس أو صدفة PowerShell على ويندوز عبر تنفيذ الأمر ls، وستجد في نظامَي لينكس وماك أو إس ملفين، بينما ستجد ثلاث ملفات إذا كنت تستخدم صدفة PowerShell وهي الملفات ذاتها التي ستجدها عند استخدامك طرفية CMD على ويندوز. $ ls main main.rs أدخل في طرفية CMD على ويندوز ما يلي (يعني الخيار /B أننا نريد فقط عرض أسماء الملفات): > dir /B main.exe main.pdb main.rs يعرض ما سبق شيفرة الملف المصدر بامتداد ".rs"، إضافةً إلى الملف التنفيذي (المسمى main.exe على ويندوز و main على بقية المنصات)، وعند استخدام ويندوز هناك ملف يحتوي على معلومات لتصحيح الأخطاء بامتداد ".pdb"، ويمكنك تشغيل الملف التنفيذي "main" أو "main.exe" على النحو التالي: $ ./main # أو .\main.exe على ويندوز إذا كان "main.rs" هو برنامج "Hello, world!" فسيطبع السطر السابق "Hello, world!" على طرفيتك. قد لا تكون معتادًا على كون جزء التصريف خطوة مستقلة إذا كنت تألف لغة ديناميكية، مثل روبي Ruby، أو بايثون Python، أو جافاسكربت JavaScript. تعدّ لغة رست لغة مُصرّفة سابقة للوقت ahead-of-time compiled language، مما يعني أن البرنامج يُصرّف وينتج عن ذلك ملف تنفيذي يُمنح لأحد آخر، بحيث يمكن له تشغيله دون وجود لغة رست عنده، وعلى النقيض تمامًا إذا أعطيت أحدًا ما ملفًا بامتداد ".rb" أو ".py" أو ".js" فلن يستطيع تشغيله إن لم يتواجد تطبيق روبي أو بايثون أو جافاسكربت مثبتًا عنده، والفارق هنا هو أنه عليك استخدام أمرٍ واحد فقط لتصريف وتشغيل البرنامج. تصميم لغات البرمجة مبني على المقايضات. يُعد تصريف البرنامج باستخدام rustc فقط كافيًا للبرامج البسيطة، إلا أنك ستحتاج لإدارة جميع الخيارات مع زيادة حجم برنامجك وجعل مشاركة شيفرتك البرمجية مع الغير عملية أسهل، ولذلك سنقدّم لك في الفقرة التالية أداة كارجو Cargo التي ستساعدكَ في كتابة برامج لغة رست لها تطبيقات فعلية في الحياة الواقعية. نظام بناء لغة رست "مرحبا كارجو" كارجو هو نظام بناء لغة رست ومدير حزم، إذ يعتمد معظم مستخدمي لغة رست على هذه الأداة لإدارة مشاريع رست لأنها تتكفل بإنجاز الكثير من المهام نيابةً عنك، مثل بناء شيفرتك البرمجية وتنزيل المكتبات التي تعتمد شيفرتك عليها وبناء هذه المكتبات (ندعو المكتبات التي تحتاجها شيفرتك البرمجية لتعمل بالاعتماديات dependencies). لا تحتاج برامج رست البسيطة -مثل البرنامج الذي كتبناه سابقًا- إلى أي اعتماديات، لذا إذا أردنا بناء مشروع "Hello, world!" باستخدام كارجو، فسيستخدم فقط الجزء الذي يتكفل ببناء الشيفرة البرمجية ضمن كارجو لا غير. ستُضيف بعض الاعتماديات عند كتابتك لبرامج أكثر تعقيدًا، وإذا كنت تستخدم كارجو حينها، فستكون إضافة تلك الاعتماديات سهلةً جدًا. يفترض هذا الكتاب بأنك تستخدم كارجو بما أن معظم مشاريع لغة رست تستخدمه؛ إذ يُثبَّت كارجو تلقائيًا مع رست إذا استخدمت البرنامج الرسمي لتثبيته والذي ناقشناه في فقرة التثبيت، وإذا ثبتت رست باستخدام طرق أخرى، تأكد من وجود كارجو بإدخال الأمر التالي إلى الطرفية: $ cargo --version إذا ظهر لك رقم الإصدار، فهذا يعني أنه موجود. إذا ظهرت رسالة خطأ مثل "command not found"، ألقِ نظرةً على توثيق طريقة التثبيت التي اتبعتها لمعرفة طريقة تثبيت كارجو بصورةٍ منفصلة. إنشاء مشروع للغة رست باستخدام كارجو دعنا نُنشئ مشروعًا جديدًا باستخدام كارجو ونُقارن بين هذه الطريقة وطريقتنا السابقة في إنشاء مشروع "Hello, world!". انتقل إلى مجلد "projects" (أو أي اسم مغاير اخترته لتخزّن فيه شيفرتك البرمجية)، ثم نفذ الأوامر التالية (بغض النظر عن نظام تشغيلك): $ cargo new hello_cargo $ cd hello_cargo يُنشئ الأمر الأول مجلدًا جديدًا باسم "hello_cargo" -إذ أننا اخترنا تسمية "hello_cargo" لمشروعنا- ومن ثم يُنشئ كارجو ملفاته في المجلد الذي اخترناه بذات الاسم. اذهب إلى المجلد "hello_cargo" واعرض الملفات الموجودة فيه، ستجد أن كارجو قد أنشأ ملفين ومجلدًا واحدًا داخله، هم: ملف باسم "cargo.toml"، ومجلد "src"، وملف "main.rs"؛ كما أنه هيأ مستودع غيت Git جديد مع ملف ".gitignore". لن تُوَلّد ملفات غيت إذا استخدمت الأمر cargo new ضمن مستودع جيت موجود مسبقًا، ويمكنك تجاوز ذلك السلوك عن طريق استخدام الأمر cargo new --vcs=git. ملاحظة: غيت هو نظام شائع للتحكم بالإصدارات، ويمكنك تغيير نظام التحكم بالإصدارات عند تنفيذ الأمر cargo new بإضافة الراية --vcs. يمكنك تنفيذ الأمر cargo new --help إذا أردت رؤية الخيارات المتاحة. افتح الملف "Cargo.toml" باستخدام محرر النصوص المفضل لديك، يجب أن تكون الشيفرة البرمجية بداخله مشابهة للشيفرة 1-2. [package] name = "hello_cargo" version = "0.1.0" edition = "2021" [dependencies] [الشيفرة 1-2: محتوى ملف Cargo.toml الناتج عن تنفيذ الأمر cargo new] يمكنك الاطلاع على مزيدٍ من المفاتيح وتعريفاتها على الرابط. هذا الملف مكتوب بتنسيق لغة TOML (اختصارًا للغة توم المُختصرة الواضحة Tom's Obvious, Minimal Langaug)، وهي لغة تنسيق كارجو. يمثل السطر الأول [package] قسم ترويسة الذي يشير إلى أن ما يليه هي معلومات لإعداد الحزمة. نُضيف المزيد من الأقسام إذا أردنا إضافة المزيد من المعلومات إلى هذا الملف. تُعدّ الأسطر الثلاث التالية المعلومات التي يحتاجها كارجو لتصريف برنامجك ألا وهي: اسم المشروع وإصدار لغة رست المُستخدم، وسنتحدث عن مفتاح edition لاحقًا. السطر الأخير [dependencies] هو بداية جزء جديد يحتوي على أي اعتماديات يعتمد عليها مشروعك لعمله. يُشار إلى حزم الشيفرات البرمجية في لغة رست باسم الصناديق crates، ولا نحتاج هنا أي صناديق أخرى لهذا المشروع، ولكننا سنحتاج إلى صناديق إضافية في مشاريع لاحقة وعندها سنستخدم هذا القسم. أما الآن فافتح الملف "main.rs" الموجود داخل المجلد "src" وألقِ نظرةً على ما داخله: fn main() { println!("Hello, world!"); } قد ولّد كارجو برنامج "!Hello, world" لك على نحوٍ مماثل للبرنامج الذي كتبناه سابقًا في الشيفرة 1-1، والاختلاف الوحيد حتى اللحظة بين مشروعنا السابق ومشروع كارجو هو أن كارجو أضاف الشيفرة البرمجية داخل مجلد "src" وأنه لدينا ملف الإعداد "Cargo.toml" في المجلد الرئيسي. يتوقع كارجو بأن تتواجد ملفاتك المصدرية داخل المجلد "src"، وأن يكون المجلد الرئيسي للمشروع فقط للملفات التوضيحية README files والمعلومات عن رخصة البرنامج license information وملفات الضبط configuration files وأي ملفات أخرى غير مرتبطة بشيفرتك المصدرية مباشرةً. يساعدك استخدام كارجو في تنظيم ملفاتك إذ أن هناك مكان لكل شيء وكلّ شيء يُخزّن في مكانه. يمكنك تحويل مشروعك إلى مشروع يستخدم كارجو إذا أنشأت مشروعًا جديدًا دون استخدام كارجو على نحوٍ مماثل لما فعلناه في مشروع "!Hello, world"، فكل ما عليك فعله هو نقل الشيفرة المصدرية الخاصة بالمشروع إلى مجلد "src" وإنشاء ملف "Cargo.toml" موافق لتفاصيل المشروع. بناء وتشغيل مشروع كارجو دعنا ننظر الآن إلى ما هو مختلف عندما نشغّل برنامج "!Hello, world" باستخدام كارجو. أنشئ مشروعك بإدخال الأمر التالي داخل المجلد "hello_cargo": $ cargo build Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs يُنشئ الأمر السابق ملف تنفيذي ضمن المجلد "target/debug/hello_cargo" (أو "target\debug\hello_cargo.exe" على ويندوز) بدلًا عن مجلدك الحالي، ويمكنك تشغيل الملف التنفيذي باستخدام الأمر التالي: $ ./target/debug/hello_cargo # أو .\target\debug\hello_cargo.exe على ويندوز Hello, world! إذا مر كل ما سبق بنجاح فستُطبع "Hello, world!" على الطرفية. يتسبب تنفيذ الأمر cargo build للمرة الأولى بإنشاء كارجو لملف جديد في المجلد الرئيسي باسم "Cargo.lock" وهذا الملف يتابع إصدارات الاعتماديات المستخدمة في مشروعك، وبما أن هذا المشروع لا يحتوي على أي اعتماديات، فلن يكون هذا الملف ذا أهمية كبيرة، إلا أن هذا يعني أنه لا يوجد أي حاجة لتغيير محتويات هذا الملف يدويًا بل يتكفل كارجو بمحتوياته بدلًا عنك. بنينا لتوّنا مشروعًا باستخدام cargo build وشغّلناه باستخدام الأمر ./target/debug/hello_cargo، إلا أنه يمكننا استخدام الأمر cargo run أيضًا لتصريف الشيفرة البرمجية وتشغيلها مما ينتج عن تشغيل الملف التنفيذ باستخدام أمر واحد فقط: $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs Running `target/debug/hello_cargo` Hello, world! يستخدم معظم المطورين cargo run لأنه أكثر ملاءمةً من تذكُّر تشغيل cargo build ثم استخدام المسار الكامل وصولًا للملف الثنائي (التنفيذي). لاحظ أننا لم نرى هذه المرة أي خرج يشير إلى أن كارجو يصرّف "hello_cargo"، وذلك لأن كارجو لاحظ أن الملف لم يتغير وبالتالي فقد شغّل مباشرةً الملف الثنائي، وإلّا في حالة تعديل الشيفرة المصدرية سيعيد كارجو بناء المشروع قبل تشغيله وستجد خرجًا مشابهًا لما يلي: $ cargo run Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs Running `target/debug/hello_cargo` Hello, world! يحتوي كارجو أيضًا على أمر آخر وهو cargo check، ويتحقق هذا الأمر من شيفرتك البرمجية للتأكد من أنها ستُصرّف بنجاح ولكنه لا يولّد أي ملف تنفيذي: $ cargo check Checking hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs لكن في أيّ الحالات لن تحتاج إلى ملف تنفيذي؟ يكون الأمر cargo check أسرع غالبًا في تنفيذه من الأمر cargo build لأنه يتخطى مرحلة توليد الملف التنفيذي، وبالتالي إذا أردت التحقق باستمرار من صحة شيفرتك البرمجية خلال كتابتها فاستخدام cargo check سيُسرّع العملية بصورةٍ ملحوظة. ينفّذ معظم مستخدمي لغة رست الأمر cargo check دوريًا عادةً للتأكد من صحة شيفرتهم البرمجية ومن أنها ستُصرّف دون مشاكل، ثمّ ينفذون الأمر cargo build عندما يحين الوقت لتوليد ملف تنفيذي واستخدامه. دعنا نلخّص ما تعلمناه لحد اللحظة بخصوص كارجو: نُنشئ المشاريع باستخدام الأمر cargo new. نبني المشروع باستخدام الأمر cargo build. نستطيع بناء المشروع وتشغيله بأمر واحد وهو cargo run. يمكننا بناء المشروع دون توليد ملف تنفيذي ثنائي بهدف التحقق من الأخطاء في الشيفرة البرمجية باستخدام الأمر cargo check. يخزن كارجو ناتج عملية البناء في المجلد "target/debug" عوضًا عن تخزينها في مجلد الشيفرة البرمجية ذاتها. الميزة الإضافية في كارجو هي أن الأوامر هي نفسها ضمن جميع أنظمة التشغيل التي تعمل عليها، وبالتالي ومن هذه النقطة فصاعدًا لن نزوّدك بنظام التشغيل بالتحديد (لينكس أو ماك أو إس أو ويندوز) لكل توجيه. بناء المشروع لإطلاقه يمكنك استخدام الأمر cargo build --release عندما يصل مشروعك إلى مرحلة الإطلاق لتصريفه بصورةٍ مُحسّنة، وسيولّد هذا الأمر ملفًا تنفيذيًا في المجلد "target/release" بدلًا من المجلد "target/debug"، ويزيد التحسين من سرعة تنفيذ شيفرتك البرمجية إلا أن عملية تصريفه ستستغرق وقتًا أطول، وهذا السبب في تواجد خيارين لبناء المشروع: أحدهما هو بهدف التطوير عندما تحتاج لبناء المشروع بسرعة وبصورةٍ دورية والآخر لبناء النسخة النهائية من البرنامج التي ستعطيها إلى المستخدم وفي هذه الحالة لن تُصرّف البرنامج دوريًا وسيكون البرنامج الناتج أسرع ما يمكن. إذا أردت قياس الوقت الذي تستغرقه شيفرتك البرمجية لتُنفّذ، استخدم الأمر cargo build --release وقِس الوقت باستخدام الملف التنفيذي الموجود في المجلد "target/release". أداة كارجو مثل أداة عرض لن يقدّم لك كارجو في المشاريع البسيطة الكثير من الإيجابيات مقارنةً باستخدام الأمر rustc، إلا أن الفارق سيتضح أكثر حالما تعمل على برنامج معقدة تتألف من عدّة صناديق crates، وعندما تنمو البرامج لعدة ملفات أو تحتاج إلى اعتماديات، فمن الأسهل في هذه الحالة استخدام كارجو لتنسيق عملية بناء المشروع. على الرغم من بساطة مشروع "hello_cargo" السابق إلا أنه يستخدم الآن الأدوات الواقعية والعملية التي ستستخدمها طوال مسيرتك مع لغة رست، وحتى تستطيع العمل على أي مشروع موجود مسبقًا، يمكنك استخدام الأوامر التالية للتحقق من الشيفرة البرمجية باستخدام غيت، ثمّ انتقل إلى مجلد المشروع وابنه: $ git clone example.org/someproject $ cd someproject $ cargo build لمزيدٍ من المعلومات حول كارجو، انظر إلى التوثيق. ملخص لقد قطعتَ شوطًا كبيرًا ضمن رحلتك مع لغة رست في هذا المقال، إذ تعلمنا ما يلي: تثبيت آخر إصدارات لغة رست المستقرة باستخدام rustup. تحديث إصدار لغة رست الموجود إلى آخر جديد. فتح التوثيق المحلي (دون اتصال بالإنترنت). كتابة وتشغيل برنامج "!Hello, world" باستخدام rustc مباشرةً. إنشاء وتشغيل برنامج جديد باستخدام أداة كارجو. حان الوقت المناسب لبناء برنامج أكثر واقعية للاعتياد على قراءة وكتابة شيفرة رست. لذا، سنبني في المقالة التالية برنامج لعبة تخمين، لكن إذا أردت تعلم أساسيات البرمجة في لغة رست، انتقل إلى المقالة التي تليها مباشرةً. ترجمة -وبتصرف- لفصل Getting Started من كتاب The Rust Programming Language. اقرأ أيضًا المقال التالي: برمجة لعبة تخمين الأرقام بلغة رست Rust تعلم البرمجة دليلك الشامل إلى لغات البرمجة1 نقطة