لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 05/03/20 في كل الموقع
-
2 نقاط
-
2 نقاط
-
السلام عليكم لقد شحنتُ رصيدي على مستقل بمبلغ معين لاستخدامه في مشاريع مستقبلية، فهل شحني رصيدي على مستقل يعني خصمه حساب البايبال الخاص بي؟ يعني هل ممكن أسحب المبلغ مرة أخرى؟1 نقطة
-
السلام عليكم ورحمة الله وبركاتة بأذن الله راح أبدا في دورة تصميم الواجهات من حسوب لكن قبل ان اشتريها حاب اطمئن من من قام بشراء ومتابعة الدورة هل كانت جيده حقا ؟ هل فعلا بعد الدورة استطعتم القيام بمشاريع لعملاء من خلال خمسات او مستقل ؟ اتمنى نصائحكم لأستفيد أقصى استفاده من الدورة1 نقطة
-
1 نقطة
-
سؤالي هو كالآتي: انا مبتدأ في مجال البرمجة ..لا املك حاسوب حاليا ..هل تستطيع ان أبد بهاتفي الاندرويد (Huawei y7 prime 2018) ???1 نقطة
-
أهلاً أخ فادي على حسب خبرتي في هذا المجال فإنني أرى بأن لمصممي الجرافيك مستقبل رائع بإذن الله،، فجميع الشركات و المجالات و حتى أصغر المشاريع تحتاج لمصمم الجرافيك ليصمم شعاراتها و إعلاناتها و منشوراتها سواءً مطبوعة أو على الشاشات و مع وضعنا الحالي و أزمة الكورونا فإن الجميع بدأ يتجه لتصميم صفحاته على السوشيال ميديا و الويب،، و بذلك ازداد الاحتياج لمصممي الجرافيك و لله الحمد1 نقطة
-
لدي قاعدة بيانات قديمة معدّة على Mysql والآن أنا بصدد القيام بأخرى جديدة على PostgreSQL، وأريد نقل البيانات الموجودة في قاعدة البيانات القديمة إلى الجديدة لكن المشكل في عدم توافقا الأسماء في كلتا القاعدتين، هل من طريقة لحل المشكل؟ بطريقة احترافية؟1 نقطة
-
Write a c++ function,name it isfloat that checks if number is float or not.the correct float number comes in any of following forms +0.1253 to get extra points ,you can check for the following float forms as well 0.156e10 then ,ask the user to enter two float numbers (check them using isfloat function that you wrote above)and your program should print the sum and multiplication of the two float numbers h,1 نقطة
-
هل أستطيع أن أحضر من كل باب درس أم يجب أن أحضرها متسلسلة؟ مثال باب علوم الحاسوب هناك ( سكراتش ثم الخوارزميات وهكذا ) هل يجب أن أنتهي من سكراتش ثم ابدأ بغيره أم أستطيع أن أحضر من كل باب درس؟1 نقطة
-
اي من التالي يستخدم لإلغاء تفعيل مفتاح رئيسي في جدول تم انشائه مسبقا؟ "ALTER TABLE TABLE_NAME MODIFY ( FILED_NAME FILED_TYPE CONSTRAINT );" "ALTER TABLE TABLE_NAME DISABLE PRIMARY KEY;" "ALTER TABLE TABLE_NAME ADD ( FILED_NAME FILED_TYPE CONSTRAINT );" "ALTER TABLE TABLE_NAME ENABLE PRIMARY KEY;"1 نقطة
-
حساب اعمار 10 طلاب وتحصيلهم الدراسي وجنسهم باستخدام structures ، وحساب متوسط اعمار الطلاب باستخدام for1 نقطة
-
مرحباً بك @اسامه آل سلمان. هذا هو حلل المسألة مع الشرح: #include <iostream> using namespace std; // متغير يتحكم في عدد الطلاب لجميع الوظائف const int STUDENTS_COUNT = 2; struct student { string name; string country; int age; float marks; } s[STUDENTS_COUNT]; int main() { cout << "Enter the Students: " << endl; //structure عملية تكرار حتى نملء ال for(int i = 0; i < STUDENTS_COUNT; ++i) { cout << "Enter name: "; cin >> s[i].name; cout << "Enter country: "; cin >> s[i].country; cout << "Enter Age: "; cin >> s[i].age; cout << "Enter marks: "; cin >> s[i].marks; cout << "---------\n"; cout << endl; } cout << "Students Info: " << endl; //متغير متوسط الأعمار float average_age; // متغير مجموع الأعمار int total_age = 0; // عرض بيانات الطلاب for(int i = 0; i < STUDENTS_COUNT; ++i) { cout << "Student: " << s[i].name << endl; cout << "Country: " << s[i].country << endl; cout << "Age: " << s[i].age << endl; cout << "Marks: " << s[i].marks << endl; cout << "----------\n" << endl; //total_age في كل تكرار نضيف عمر الطلاب على total_age += s[i].age; } //حساب متوسط الأعمار average_age = total_age / STUDENTS_COUNT; //عرض المتوسط cout << "Average age : "; cout << average_age << "\n--------------\n"; //عرض مجموع الأعمار cout << "Total age : "; cout << total_age << "\n--------------\n"; return 0; } شكراً لك.1 نقطة
-
مرحبا أخي @KingAnime. الكود يبدو مكتوب بطريقة تناسب ما طلبت , لكن يمكن أن تترك إستعمال ال f "")print) format, و إعتمد على طريقة دمج النص مع المتغير و تحويل القيمة , مثل آخر مثال . شكراً لك.1 نقطة
-
الف شكر لك اخي استاذ عزام. كفيت ووفيت. ماشاء الله عليك محترف. أستاذي, هل طريقتك في كتابة الكود احترافيه او بأبسط طريقة, يعني في المستوى الاول. لان استاذ الجامعة متوقع اننا مبتدئين فأذا شاف طريقة كتابة الكود احترافه فيمكن يشك انه شخص اخر عمل الكود. تقبل تحياتي1 نقطة
-
أهلا بك أمانى الطريقة بسيطة وكالآتي وهى بعد أن تنفذي كل شيئ فى الدالة أقصد ال Logic تستخدمي كلمة return قبل القيمة المراد إرجاعها ولكن يجب أن تأخذي في الإعتبار أن أى كود سوف تكتبيه بعد كلمة return لن ينفذ إطلاقا أمثلة بلغة جافاسكربت function returnNumber() { const x = 5; return x; // 5 } function returnstring() { const firstname = 'Mohammed'; const lastname = 'saber'; return firstname + ' ' + lastname; // 'Mohammed Saber' } function returnObject() { const validUser = true; let _obj = { userName: 'Mohammed' }; if(validUser) { obj.password = 'M0h@mmEd'; } return _obj; // { userName: 'Mohammed', password: 'M0h@mmEd' } } function returnArray() { return []; // [] } /* ============================== Special Case ============================ */ function dontConsoleLog() { const x = 3; return x + 5; // 8 /* لن ينفذ هذا الجزء لأن الدالة إنتهت */ console.log('x', x); // will not be executed because it is unreachable Code } للمزيد من المعلومات يرجى مراجعة Return Docs1 نقطة
-
مرحباً أخي . نستعمل الدالة str() حتى يتم تغيير القيمة إلى نص , مثال : num1 = 10 print("my number is " + num1) #مع النص num1 هذا المثال لا يعمل , لا يمكن دمج الرقم print("my number is " + str(num1))#سوف يتغير إلى نص num1 , هذا يعمل شكراً لك.1 نقطة
-
مرحباً بك @Manar Ramadan. هذا هو الحلل : #include <iostream> using namespace std; bool isfloat(float f1, float f2) { // المنطق : // عليمة طرح الرقم مع ذاته من غير كسور و المقارنة بعد ذلك إذا كان أكبر من صفر // و نسترجع قيمة منطقية على حسب الحال if( abs(f1-int(f1) > 0 && abs(f2-int(f2) > 0 ))){ return true; }else{ return false; } } int main() { float f1,f2; // المستخدم يكتب الأرقام cout << "Float 1 : "; cin >> f1; cout << "Float 2 : "; cin >> f2; //متغير القيمة المنطقية bool isFloat = isfloat(f1,f2); if (isFloat){ //floats إذا كان الرقمان cout << "They are Floats" << "\n"; cout << "Multiply : "; cout << f1 * f2 << "\n"; cout << "Addition : "; cout << f1 + f2 << "\n"; }else{ //floats إذا لم يكن الرقمان cout << "Both or one of them is Integars" << "\n"; } return 0; } شكراً لك.1 نقطة
-
اخوي نبيل مشكور جدا استفدت منك كثيرا و لك كل الامتنان و باقة الورد1 نقطة
-
مرحباً أخي @KingAnime. حل السؤال الثاني : # author: # date: # purpose: Calculate Price of Groceries # input orange_pound_price = float(input ("price of orange per pound: ")) orange_pounds = float(input ("pound of oranges purchased: ")) apple_pound_price = float(input ("price of apples per pound: ")) apple_pounds = float(input ("pound of apples purchased: ")) # calculations total_oranges_price = float( orange_pound_price * orange_pounds) total_apples_price = float(apple_pound_price * apple_pounds) total_groceries = float(total_oranges_price + total_apples_price) # output print (f"Oranges {total_oranges_price}") print (f"Apples {total_apples_price}") total_groceries = '{:.2f}'.format(total_groceries) # نجعل المتغير يحتوي على رقمين بعد علامة كسر eg 3.94 print (f"Total {total_groceries}") لديك خطأ في كتابة بعض الكود مثل float و ليس floate , و print و ليس Print . أيضاً إذا كنت تريد تستعمل متغير مع النص , يمكنك أن تستخدم f أو تحمعهم بعلامة الجمع + وليس بفاصلة. حاول أن تكون أسماء المتغيرات دائماً واضحة و معبرة . حل السؤال الثالث : months = int(input (" total number of months: ")) # ناخد العدد و نغيير إلى نوع بيانات رقمية # calculations years = months // 12 # عملية تقسيم left_months = months % 12 # تعين الرقم المتبقي بعد التقسيم ‘على 12 # output print (f"{months} months is {years} year(s) and {left_months} month(s)") حل السؤال الرابع: # input balance = float ( input (" Begin Balance: ")) # أخذ القيمة monthly_deposits = float ( input ( "Deposits: ")) monthly_withdrawals = float ( input ( "Withdrawals: ")) # calculations begin_balance = balance balance += monthly_deposits # عملية إضافة balance -= monthly_withdrawals# عملية تنفيص # output print ( "Beginning balance is " + str(begin_balance)) # تغيير المتغير إلى نص print ( "Ending balance is " + str(balance)) ملاحظة : كل هذه الحلول تجلب النتيجة الصحيحة , إذا تجد خلل في syntax , هذا تفضيل في طريقة كتابة الكود من المدرس . شكراً لك.1 نقطة
-
السلام عليكم بإمكانك من خلال مستقل أن تجد الشخص المناسب لإنجاز العمل المطلوب, حيث عند كتابة مقترح المشروع على مستقل, ضع شرط أن يكون المستقل full stack developer, أي لديه المقدرة الكاملة لإنجاز المشروع من الصفر حتى التسليم. كما أعتقد أن هناك الكثير من المستقلين يعملون كفريق متكامل مع المصممين والمبرمجين ومحللي النظم.1 نقطة
-
كما نعلم فالدوال في لغة جافاسكربت تُعدّ قيمًا. ولكلّ قيمة في هذه اللغة نوع. ولكن ما نوع الدالة نفسها؟ تُعدّ الدوال كائنات في جافاسكربت. يمكننا تخيّل الدوال على أنّها «كائنات إجرائية» يمكن استدعائها. لا يتوقّف الأمر عند الاستدعاء أيضًا بل يمكن حتّى أن نُعاملها معاملة الكائنات فنُضيف الخاصيات ونُزيلها، أو نمرّرها بالإشارة وغيرها من أمور. خاصية الاسم name تحتوي كائنات الدوال على خاصيات يمكننا استعمالها. فمثلًا يمكن أن نعرف اسم الدالة من خاصية الاسم name: function sayHi() { alert("Hi"); } alert(sayHi.name); // sayHi والمُضحك في الأمر هو أنّ منطق اللغة في إسناد الاسم ذكيّ (الذكاء الاصطناعي مبهر)، فهو يُسند اسم الدالة الصحيح حتّى لو أنشأناها بدون اسم ثمّ أسندناها إلى متغير مباشرةً: let sayHi = function() { alert("Hi"); }; alert(sayHi.name); // sayHi (للدالة اسم!) كما ويعمل المنطق أيضًا لو كانت عملية الإسناد عبر قيمة مبدئية: function f(sayHi = function() {}) { alert(sayHi.name); // sayHi (تعمل أيضًا!) } f(); تُدعى هذه الميزة في توصيف اللغة «بالاسم السياقي». فلو لم تقدّم الدالة اسمًا لها فيحاول المحرّك معرفته من السياق مع أوّل عملية إسناد. كما ولتوابِع الكائنات أسماء أيضًا: let user = { sayHi() { // ... }, sayBye: function() { // ... } } alert(user.sayHi.name); // sayHi alert(user.sayBye.name); // sayBye ولكن ليس للسحر مكان هنا، فهناك حالات يستحيل على المحرّك معرفة الاسم الصحيح منها، بهذا تكون خاصية الاسم فارغة، كما في هذه الشيفرة: // نُنشئ دالة في مصفوفة let arr = [function() {}]; alert( arr[0].name ); // <سلسلة نصية فارغة> // ما من طريقة يعرف بها المحرّك الاسم الصحيح، فباختصار، ليس هناك اسم! ولكن عمليًا، لكل الدوال أسماء أغلب الوقت. خاصية الطول length توجد خاصية أخرى مضمّنة في اللغة باسم length وهي تُعيد عدد مُعاملات الدالة. مثال: function f1(a) {} function f2(a, b) {} function many(a, b, ...more) {} alert(f1.length); // 1 alert(f2.length); // 2 alert(many.length); // 2 نرى هنا بأن المُعاملات البقية لم تُحسب. يستعمل المطوّرون خاصية length أحيانًا لإجراء التحقّق الداخلي داخل الدوال التي تعتمد في تشغيلها على التحكّم بدوال أخرى. في الشيفرة أسفله، تقبل دالة ask سؤالًا question تطرحه وعددًا غير محدّد من دوال المعالجة handler لتستدعيها دالة السؤال. فما إن ينزل الوحي على المستخدم ويُعطينا إجابة تستدعي الدالة المُعالجات. يمكننا تمرير نوعين اثنين من المُعالجات هذه: دالة ليس لها وُسطاء لا تُنشأ إلا عندما يُعطيها المستخدم إجابة بالإيجاب. دالة لها وُسطاء تُستدعى في بقية الحالات وتُعيد إجابة المستخدم. علينا فحص خاصية handler.length لنستدعي handler بالطريقة السليمة. الفكرة هنا هي أن تستعمل الشيفرة صياغة مُعالجة بسيطة وبدون وُسطاء لحالات الإيجاب (وهذا الشائع)، إضافةً على دعم المُعالجات العامة أيضًا: function ask(question, ...handlers) { let isYes = confirm(question); for(let handler of handlers) { if (handler.length == 0) { if (isYes) handler(); } else { handler(isYes); } } } // يُعاد كِلا المُعالجان لو كانت الإجابة بالإيجاب // ولو كانت بالسلب، فالثاني فقط ask("Question?", () => alert('You said yes'), result => alert(result)); هذه حالة من حالات التعدّدية الشكلية، أي حين يتغيّر تعاملنا مع الوُسطاء حسب أنواعها… في حالتنا فهي حسب أطوالها length. لهذه الفكرة استعمال فعليّ في مكتبات جافاسكربت. خاصيات مخصصة يمكننا أيضًا إضافة ما نريد من خاصيات. فهنا نُضيف خاصية العدّاد counter ليسجّل إجمالي عدد الاستدعاءات: function sayHi() { alert("Hi"); // لنعدّ كم من مرّة شغّلناه sayHi.counter++; } sayHi.counter = 0; // القيمة الأولية sayHi(); // Hi sayHi(); // Hi alert( `Called ${sayHi.counter} times` ); // Called 2 times الخاصيات ليست متغيرات لا تعرّف الخاصية المُسندة إلى الدوال مثل sayHi.counter = 0 متغيرًا محليًا فيها (counter في حالتنا). أي أنّ لا علاقة تربط الخاصية counter بالمتغير let counter البتة. يمكننا التعامل مع الدوال على أنها كائنات فنخزّن فيها الخاصيات، ولكن هذا لا يؤثّر على طريقة تنفيذها. ليست المتغيرات خاصيات للدالة ولا العكس، كلاهما منفصلين يسيران في خطّين مُحال أن يتقاطعا. يمكننا أحيانًا استعمال خاصيات الدوال بدل المُنغلِقات. فمثلًا يمكن إعادة كتابة تمرين دالة العدّ في فصل «المُنغلِقات» فنستعمل خاصية دالة: function makeCounter() { // بدل: // let count = 0 function counter() { return counter.count++; }; counter.count = 0; return counter; } let counter = makeCounter(); alert( counter() ); // 0 alert( counter() ); // 1 هكذا خزّنا الخاصية count في الدالة مباشرةً وليس في بيئتها المُعجمية الخارجية. أهذه أفضل أم المنغلقات أفضل؟ الفرق الرئيس هو: لو كانت قيمة count «تحيا» في متغير خارجي فلا يمكن لأي شيفرة خارجية الوصول إليها، بل الدوال المتداخلة فقط من يمكنها تعديلها، ولو ربطناها بدالة فيصير هذا ممكنًا: function makeCounter() { function counter() { return counter.count++; }; counter.count = 0; return counter; } let counter = makeCounter(); // هذا counter.count = 10; alert( counter() ); // 10 إذًا فالخيار يعود لنا: ماذا نريد وما الغاية. تعابير الدوال المسماة كما اسمها، فتعابير الدوال المسمّاة (Named Function Expression) هي تعابير الدوال التي لها اسم… بسيطة. لنأخذ مثلًا تعبير دالة مثل أي تعبير تراه في حياتك البرمجية التعيسة: let sayHi = function(who) { alert(`Hello, ${who}`); }; والآن نُضيف اسمًا له: let sayHi = function func(who) { alert(`Hello, ${who}`); }; هل حللنا أزمة عالمية هنا؟ ما الداعي من هذا الاسم "func"؟ أولًا، ما زال أمامنا تعبير دالة، فإضافة الاسم "func" بعد function لم يجعل الجملة تصريحًا عن دالة إذ ما زلنا نصنع الدالة داخل جزء من تعبير إسناد. كما وإضافة الاسم لم يُعطب الدالة بأي شكل. يمكن أن ندخل الدالة هكذا sayHi(): let sayHi = function func(who) { alert(`Hello, ${who}`); }; sayHi("John"); // Hello, John ثمّة أمرين مميزين بهذا الاسم func وهما السبب وراء كل هذا: يتيح الاسم بأن تُشير الدالة إلى نفسها داخليًا. ولا يظهر الاسم لما خارج الدالة. فمثلًا تستدعي الدالة sayHi أسفله نفسها ثانيةً بالوسيط "Guest" لو لم نمرّر لها who من البداية: let sayHi = function func(who) { if (who) { alert(`Hello, ${who}`); } else { func("Guest"); // نستعمل func لنستدعي نفسنا ثانيةً } }; sayHi(); // Hello, Guest // ولكن هذا لن يعمل: func(); // ويعطينا خطأً بأنّ func غير معرّفة (فالدالة لا تظهر لما خارجها) ولكن لمَ نستعمل func أصلًا؟ ألا يمكن أن نستعمل sayHi لذلك الاستدعاء المتداخل؟ للصراحة، يمكن ذلك في حالات عديدة: let sayHi = function(who) { if (who) { alert(`Hello, ${who}`); } else { sayHi("Guest"); } }; مشكلة تلك الشيفرة هي احتمالية تغيّر sayHi في الشيفرة الخارجية. فلو أُسندت الدالة إلى متغير آخر بدل ذاك فستبدأ الأخطاء تظهر: let sayHi = function(who) { if (who) { alert(`Hello, ${who}`); } else { sayHi("Guest"); // خطأ: sayHi ليست بدالة } }; let welcome = sayHi; sayHi = null; welcome(); // خطأ: لم يعد الاستدعاء المتداخل sayHi يعمل بعد الآن! سبب ذلك هو أنّ الدالة تأخذ sayHi من بيئتها المُعجمية الخارجية إذ لا تجد sayHi محليًا فيها فتستعمل المتغير الخارجي. وفي لحظة الاستدعاء تلك يكون sayHi الخارجي قد صار null. وهذا الداعي من ذلك الاسم الذي نضعه في تعبير الدالة، أن يحلّ هذه المشاكل بذاتها. هيًا نُصلح شيفرتنا: let sayHi = function func(who) { if (who) { alert(`Hello, ${who}`); } else { func("Guest"); // الآن تعمل كما يجب } }; let welcome = sayHi; sayHi = null; welcome(); // Hello, Guest (الاستدعاءات المتداخلة تعمل) الآن صارت تعمل إذ الاسم "func" محليّ للدالة فقط ولا تأخذها من الخارج (ولا تظهر للخارج أيضًا). تضمن لنا مواصفات اللغة بأنّها ستُشير دومًا وأبدًا إلى الدالة الحالية. مع ذلك فما زالت الشيفرة الخارجية تملك المتغيرين sayHi وwelcome، بينما func هو «اسم الدالة داخليًا» أي كيف تستدعي الدالة نفسها من داخلها. ما من ميزة كهذه للتصريح عن الدوال ميزة «الاسم الداخلي» هذه التي شرحناها هنا مُتاحة لتعابير الدوال فقط وليست متاحة للتصريحات عن الدوال. فليس لهذه الأخيرة أية صياغة برمجية لإضافة اسم «داخلي» لها. لكن أحيانًا نرى حاجة بوجود اسم داخلي نعتمد عليه، حينها يكون السبب وجيهًا بأن نُعيد كتابة التصريح عن الدالة إلى صيغة تعبير الدالة المسمّى. ملخص تُعدّ الدوال كائنات. شرحنا في الفصل خصائصها: اسمها name -- غالبًا ما يأتي من تعريف الدالة. لكن لو لم يكن هناك واحد فيحاول المحرّك تخمينه من السياق (مثلًا من عبارة الإسناد). عدد مُعاملتها في تعريف الدالة length -- لا تُحسب المُعاملات البقية. لو عرّفنا الدالة باستعمال تعبير عن دالة (وليس في الشيفرة الأساس)، وكان لهذه الدالة اسم فنُسمّيها بتعبير الدالة المسمّى. كما يمكن أن تحمل الدوال خاصيات إضافية، وتستغل الكثير من مكتبات جافاسكربت المعروفة هذه الميزة أيّما استغلال. إذ تُنشئ دالة «رئيسة» بعدها تُرفق دوال أخرى «مُساعِدة» إليها. فمثلًا تُنشئ مكتبة jQuery الدالة بالاسم $، وتُنشئ مكتبة lodash الدالة بالسم _ ثمّ تُضيف خاصياتها _.clone و _.keyBy وغيرها (طالع docs متى أردت معرفتها أكثر). ما تفعله هذه الدوال يعود إلى أنّها (في الواقع) تحاول حدّ «التلوّث» في المجال العمومي فلا تستعمل المكتبة إلّا متغيرًا عموميًا واحدًا. وهذا يُقلّل من أدنى إمكانية لتضارب الأسماء. إذًا، فالدالة تؤدي عملًا رائعًا كما هي، وأيضًا تحوي على وظائف أخرى خاصيات لها. تمارين ضبط قيمة العداد وإنقاصها الأهمية: 5 عدّل شيفرة الدالة makeCounter() بحيث يُنقص العدّاد قيمتها إضافةً إلى ضبطها: على counter() إعادة العدد التالي (كما في الأمثلة السابقة). على counter.set(value) ضبط قيمة العدّاد لتكون value. على counter.decrease() إنقاص قيمة العدّاد واحدًا (1). طالِع الشيفرة أدناه كي تعرف طريقة استعمال الدالة: function makeCounter() { let count = 0; // ... شيفرتك هنا ... } let counter = makeCounter(); alert( counter() ); // 0 alert( counter() ); // 1 counter.set(10); // نضبط العدد الجديد alert( counter() ); // 10 counter.decrease(); // نُنقص العدد واحدًا 1 alert( counter() ); // 10 (بدل 11) ملاحظة: يمكنك استعمال مُنغلِق أو خاصية دالة لحفظ العدد الحالي، أو لو أردت فاكتب الحل بالطريقتين. الحل يستعمل الحل المتغير count محليًا، كما وتوابِع أخرى نكتبها داخل الدالة counter. تتشارك هذه التوابِع ذات البيئة المُعجمية الخارجية كما وترى أيضًا قيمة count الحالية. مجموع ما في الأقواس أيًا كان عدد الأقواس الأهمية: 5 اكتب الدالة sum لتعمل كالآتي: sum(1)(2) == 3; // 1 + 2 sum(1)(2)(3) == 6; // 1 + 2 + 3 sum(5)(-1)(2) == 6 sum(6)(-1)(-2)(-3) == 0 sum(0)(1)(2)(3)(4)(5) == 15 تريد تلميحًا؟ ربما تكتب كائنًا مخصّصًا يُحوّل الأنواع الأولية لتُناسب الدالة. أيّما كانت الطريقة التي سنستعملها ليعمل هذا الشيء، فلا بدّ أن تُرجع sum دالة. على تلك الدالة أن تحفظ القيمة الحالية بين كلّ استدعاء والآخر داخل الذاكرة. حسب المهمّة المُعطاة، يجب أن تتحول الدالة إلى عدد حين نستعملها في ==. الدوال كائنات لذا فعملية التحويل ستنفع كما شرحنا في فصل «التحويل من كائن إلى قيمة أولية»، ويمكن أن نقدّم تابِعًا خاصًا يُعيد ذلك العدد. إلى الشيفرة: function sum(a) { let currentSum = a; function f(b) { currentSum += b; return f; } f.toString = function() { return currentSum; }; return f; } alert( sum(1)(2) ); // 3 alert( sum(5)(-1)(2) ); // 6 alert( sum(6)(-1)(-2)(-3) ); // 0 alert( sum(0)(1)(2)(3)(4)(5) ); // 15 لاحظ بأنّ دالة sum تعمل مرّة واحدة فقط لا غير، وتُعيد الدالة f. وبعدها في كلّ استدعاء يليها، تُضيف f المُعامل إلى المجموع currentSum وتُعيد نفسها. لا نستعمل التعاود في آخر سطر من f. هذا شكل التعاود: function f(b) { currentSum += b; return f(); // <-- استدعاء تعاودي } بينما في حالتنا نُعيد الدالة دون استدعائها: function f(b) { currentSum += b; return f; // <-- لا تستدعي نفسها، بل تُعيد نفسها } وستُستعمل f هذه في الاستدعاء التالي، وتُعيد نفسها ثانيةً مهما لزم. وبعدها حين نستعمل العدد أو السلسلة النصية، يُعيد التابِع toString المجموع currentSum. يمكن أيضًا أن نستعمل Symbol.toPrimitive أو valueOf لإجراء عملية التحويل. ترجمة -وبتصرف- للفصل Function object, NFE من كتاب The JavaScript language1 نقطة
-
تُعتبر منصّة Xamarin في الوقت الحالي، من أهمّ منصّات تطوير تطبيقات الأجهزة المحمولة المتوفّرة، والتي يبدو أنّها ستبقى على الواجهة لوقت ليس بالقليل، خصوصًا بعد استحواذ شركة مايكروسوفت على الشركة المنتجة لها والتي تحمل أيضًا نفس الاسم (Xamarin). قد تكون متحفّزًا للدخول في عالم تطوير تطبيقات الأجهزة المحمولة (كما كنت عندما تعرّفت للمرّة الأولى على Xamarin) ومستعدًّا لكتابة الشيفرة مباشرةً، ولكن لنصبر قليلًا، ولنفهم بدايات الأمور، ومبدأ عمل Xamarin بشكل أفضل ضمن هذا المقال، الذي يُعدّ الأوّل في سلسلة مقالات سترشدك إلى كيفيّة تطوير تطبيقات باستخدام منصّة Xamarin مع إنشاء تطبيقات عمليّة من خلالها. مقدمة تمّ تأسيس شركة Xamarin (وتُقرأ زامارين) في عام 2011، من قِبَل نفس المهندسين الذين صمّموا مشروع Mono. ومشروع Mono وإخوانه مثل Mono for android و Mono Touch، هي عبارة عن منصّات لتشغيل تطبيقات مكتوبة بلغة سي شارب C# على أنظمة التشغيل: Linux و Android و iOS على الترتيب. يمكن باستخدام Xamarin إنشاء تطبيقات أصليّة Native Apps لأجهزة Android و iOS و Mac وويندوز بلغة برمجة ليست معتمدة رسميًا بالنسبة إليها. سنركّز في هذه السلسلة على بناء تطبيقات تعمل على نظام التشغيل Android. لمن هذه السلسلة؟ إذا كان لديك إلمام جيّد بلغة سي شارب ومكتبة الأصناف الأساسيّة BCL ضمن إطار العمل دوت نت بالإضافة إلى معرفة أوليّة بطريقة استخدام بيئة التطوير Visual Studio 2015، وتمتلك الشغف والصبر لتعلّم كيفيّة برمجة تطبيقات للأجهزة المحمولة باستخدام Xamarin فإنّ هذه السلسلة هي بالتأكيد لك. لدينا هنا في أكاديميّة حسوب سلسلة تعليميّة خاصّة بلغة سي شارب يمكن الاستفادة منها. الحاجة إلى Xamarin برزت الحاجة إلى Xamarin بسبب طبيعة تطبيقات الأجهزة المحمولة وعملها على أنظمة تشغيل مختلفة تعود إلى شركات متنافسة. توجد في الوقت الحالي ثلاثة أنظمة تشغيل مسيطرة على السوق بصورة متفاوتة وهي: iOS لشركة Apple وAndroid لشركة Google وWindows Phone لشركة Microsoft. تختلف هذه الأنظمة في العديد من النواحي، التي سنناقشها فيما يلي. تجربة المستخدم بالنسبة إلى تجربة المستخدم يوجد تشابه في هذه الأنظمة من ناحية تقديم الواجهات الرسوميّة للمستخدم والتفاعل مع الجهاز من خلال اللمس أو اللمس المتعدّد، ولكنّ هناك اختلافات في التفاصيل. فلكلّ نظام تشغيل وسائل مختلفة في التنقّل بين صفحات التطبيق، وفي تقديم البيانات، وفي العمل مع القوائم، وغيرها من التفاصيل الأخرى التي تتطلّب أن يسلك المطوّر developer منحىً مختلفًا من أجل كلّ نظام تشغيل. بيئات تطوير ولغات برمجة مختلفة أمّا بالنسبة للغات البرمجة وبيئات التطوير، فهذا أمر آخر. فلكلّ نظام تشغيل متطلّباته الخاصّة التي ألخّصها بشكل سريع فيما يلي: لإنشاء تطبيقات على أنظمة iOS فأنت تحتاج إلى إتقان لغة البرمجة Objective-C أو لغة البرمجة Swift. وأن تمتلك حاسوب MacBook (أي إصدار) مع بيئة التطوير Xcode. لإنشاء تطبيقات على أنظمة Android فستحتاج إلى لغة جافا Java مع بيئة التطوير Android Studio التي تعمل على العديد من أنظمة التشغيل. أمّا لإنشاء تطبيقات تعمل على Windows Phone أو Windows 10 Mobile فأنت بحاجة إلى لغة البرمجة سي شارب C# مع حاسوب يشغّل ويندوز، وإلى بيئة التطوير Visual Studio. واجهات برمجية مختلفة تعتمد جميع أنظمة التشغيل السابقة على واجهات تطبيق برمجيّة API مختلفة. مع أنّه يوجد بعض الشبه بالنسبة للكائنات المتعلّقة بواجهة المستخدم user-interface. فعلى سبيل المثال، جميع الأنظمة السابقة توفّر وسيلة للمستخدم لاختيار حالة منطقيّة Boolean والتي يمكن تمثيلها بـ True أو False ففي iOS يصنّف هذا الكائن على أنّه view اسمه UISwitch، أمّا في أندرويد فهو widget اسمها Switch، وفي ويندوز فهو control ويسمّى ToggleSwitch. الحل الذي توفره Xamarin يمكن تجاوز جميع النقاط السابقة من خلال Xamarin لأنّها توفّر لغة برمجة وحيدة وهي سي شارب يمكن استخدامها لكتابة تطبيقات على أيّ نظام تشغيل. كما أنّها توفّر بيئة تطوير متقدّمة ووحيدة وهي Visual Studio 2015 لكتابة هذه التطبيقات (يمكن استخدام بيئة التطوير Xamarin Studio أيضًا بالنسبة لنظام Mac). بالإضافة إلى أنّها وحّدت الواجهات البرمجيّة المختلفة API ضمن واجهة برمجيّة وحيدة يتعامل معها المطوّر. لغة سي شارب غنيّة عن التعريف. فهي لغة قويّة ومرنة وغنيّة جدًا ودائمة التطوير. لقد أصبحت بحق من أكثر لغات البرمجة تطوّرًا وحداثةً. ولسنا هنا بصدد تفضيل لغة برمجة على أخرى، ولكن بحسب خبرتي الشخصيّة، واطّلاعي على العديد من لغات البرمجة الأخرى، تستطيع القول بأنّ سي شارب تحتلّ موقعًا مرموقًا بينها. يستطيع المطوّرون من أجل تطبيق محدّد، كتابة شيفرة واحدة مشتركة لجميع أنظمة التشغيل السابقة بدون أيّة تعديلات تُذكر عليها فيما يتعلّق بمنطق العمل business logic داخل التطبيق وبما يتضمنّه من عمليّات برمجيّة لا تتعلّق بنوع الجهاز المحمول أو نظام التشغيل الذي يعمل عليه. نسمّي هذه الشيفرة بالشيفرة المستقلة عن نظام التشغيل platform independent. أمّا إذا تطلّب الأمر من التطبيق أن يتعامل مع العتاد الصلب للجهاز الذي يعمل عليه (مثل الكاميرا أو حسّاس GPS مثلًا)، فيمكن عندها كتابة أجزاء من الشيفرة التي تراعي خصوصيّة كل نظام تشغيل، نسمّي مثل هذه الشيفرة بالشيفرة المرتبطة بنظام التشغيل platform dependent. المكونات الرئيسية لمنصة Xamarin ركّزت شركة Xamarin منذ نشأتها على التكنولوجيا الخاصّة بالمترجمات Compilers. وقد أصدرت الشركة ثلاث مجموعات أساسيّة من مكتبات دوت نت .NET وهي: Xamarin.Mac و Xamarin.iOS و Xamarin.Andorid التي تشكّل بمجموعها منصّة Xamarin. تسمح هذه المكتبات للمطوّرين بكتابة تطبيقات أصليّة native apps لكلّ من أنظمة التشغيل الموافقة. ذكرنا قبل قليل أنّ هناك جزء من شيفرة التطبيق البرمجيّة يتكرّر عادةً من أجل كل نظام تشغيل، يمكن عزل هذا الجزء ووضعه ضمن مشروع منفصل في برنامج Visual Studio. لهذا المشروع نوعين: مشروع الأصول المشتركة Shared Asset Project أو اختصارًا SAP. وهو عبارة عن مجموعة من ملفات الشيفرة بالإضافة إلى ملفّات الأصول assets مثل الصور وغيرها الموجودة ضمن المشروع والتي يمكن مشاركتها مع باقي المشاريع الأخرى ضمن نفس الحل Solution في Visual Studio. مكتبة الأصناف المحمولة Portable Class Library أو اختصارًا PCL. وهي تضمّ الشيفرة التي نرغب بمشاركتها وذلك ضمن مكتبة ربط ديناميكي dynamic link library أو اختصارًا DLL. سنركّز في هذه السلسلة على هذا النوع. أمّا بالنسبة للشيفرة التي تتعلّق بنظام التشغيل، فتوضع ضمن مشروع منفصل ضمن Visual Studio لكلّ نظام تشغيل نرغب بأن ندعمه. ففي الحالة العامّة، يمكن أن يكون لدينا ثلاثة مشاريع منفصلة لكل من Android و iOS و Windows Phone. تستفيد جميعها من الشيفرة المشتركة والمستقلّة عن نظام التشغيل الموجودة في PCL أو SAP. وبالمجمل تكون جميع تلك المشاريع ضمن نفس الحل Solution ضمن Visual Studio. انظر إلى الشكل التالي الذي يوضّح كيفيّة تفاعل التطبيق المكتوب لأنظمة التشغيل المختلفة مع مكوّنات Xamarin: يمثّل الشكل السابق تطبيقًا واحدًا. نلاحظ في السطر الثاني الأشكال المختلفة لهذا التطبيق على أنظمة التشغيل المختلفة. انظر كيف تتفاعل هذه الأشكال المختلفة مع مشروع PCL أو SAP للاستفادة من الشيفرة المشتركة التي لا تتعلّق بنظام تشغيل محدّد. انظر إلى تطبيق iOS مثلًا كيف يتفاعل أيضًا مع المكتبة Xamarin.iOS التي توفّر وسيلة للربط bindings بينه وبين واجهة التطبيقات البرمجيّة API لنظام التشغيل iOS. ينطبق نفس الأمر تماماً بالنسبة لتطبيق أندرويد. الاستثناء الوحيد هو بالنسبة لتطبيق ويندوز الذي لا يحتاج إلى وسيط (وسيلة للربط) في هذه الحالة، حيث يمكنه الاتصال مباشرةً مع واجهة API لنظام التشغيل ويندوز (بصورة أدق Windows Phone). نماذج Xamarin ابتكرت شركة Xamarin في عام 2014 ما يُعرف بنماذج Xamarin أو Xamarin Forms. تسمح هذه المنصّة للمطوّرين بأن يكتبوا شيفرة برمجيّة لواجهة المستخدم user interface بحيث يمكن تحويل هذه الشيفرة مباشرةً إلى تطبيقات تعمل على أجهزة أندرويد و iOS وويندوز. في الحقيقة أصبحت Xamarin Forms تدعم إنشاء تطبيقات عامّة Universal Windows Platform على الأجهزة التي تشغّل نسخ ويندوز المختلفة مثل Windows Phone و Windows 10 و Windows 10 Mobile و Windows 8.1 و Windows 8.1 Phone. بالنسبة لبنية الحل Solution في Visual Studio فلن يتغيّر كثيرًا، باستثناء أنّ المشاريع المنفصلة الخاصّة بأنظمة التشغيل السابقة ستكون صغيرة على نحو ملحوظ بسبب وجود كميّة قليلة من الشيفرة البرمجيّة ضمنها. سيتضمّن مشروع PCL أو SAP في هذه الحالة الشيفرة المشتركة والمستقلّة عن أنظمة التشغيل كما اتفقنا على ذلك من قبل، بالإضافة إلى الشيفرة البرمجيّة المسؤولة عن الإظهار والتعامل مع واجهة المستخدم. أي أنّ منصّة Xamarin Forms تسمح لنا بكتابة شيفرة برمجيّة واحدة تعمل مباشرةً على أنظمة التشغيل المختلفة. انظر الشكل التالي لفهم آليّة عمل التطبيقات التي تعتمد Xamarin Forms. تعتمد التطبيقات المكتوبة لأنظمة التشغيل المختلفة في هذه الحالة على مشروع PCL أو SAP بشكل كليّ في التواصل مع الواجهات البرمجيّة API. وهكذا من الممكن في الكثير من التطبيقات كتابة شيفرة واحدة فقط تعمل على جميع الأجهزة! باستثناء الحالات التي يكون من الضروري فيها كتابة شيفرة مخصّصة لنظام تشغيل محدّد. في المستقبل قد يتغيّر هذا الأمر، فقد يكون من الممكن كتابة شيفرة واحدة فقط تعمل على جميع الأجهزة مهما كان نوع هذه الشيفرة. سنتحدّث في هذه السلسلة عن Xamarin Forms بشكل أساسيّ. كيفية عمل Xamarin بالنسبة لتطبيقات iOS فيعمل مترجم سي شارب الخاص بـ Xamarin على ترجمة الشيفرة البرمجيّة إلى لغة مايكروسوفت الوسيطيّة MSIL، ثمّ يُستخدم مترجم Apple على نظام تشغيل Mac لتوليد رُماز أصليّ native code يعمل على iOS كما لو أنّه تطبيق مكتوب بلغة Objective-C تمامًا. أمّا بالنسبة لتطبيقات Android، فسيولّد المترجم أيضًا لغة MSIL التي ستعمل في هذه الحالة على بيئة تنفيذ مشتركة CLR مخصّصة للعمل على أندرويد. وستكون التطبيقات الناتجة في هذه الحالة تشبه أيضًا إلى حدّ كبير تلك المنشأة باستخدام لغة جافا وبيئة التطوير Android Studio الخاصّة بأندرويد. وأخيرًا بالنسبة للتطبيقات التي تعمل على Windows Phone و Windows 10 Mobile، فالتطبيقات مدعومة بشكل واضح، وستعمل كالتطبيقات الأصليّة المنشأة باستخدام Visual Studio بدون استخدام Xamarin. الخلاصة منصّة Xamarin واعدة، ولها تاريخ عريق وتجارب غنيّة من قبل أن تظهر شركة Xamarin إلى الوجود. ولعلّ مايكروسوفت قد أدركت الأهميّة الكبيرة لها، فتمّت عمليّة الاستحواذ التي كانت متوقعّة. أنصحك بأن تبادر إلى تعلّم Xamarin وخصوصًا في حال كنت مبرمج سي شارب، أو لديك معلومات أوليّة عنها. ولعلّ الأيّام القادمة قد تحمل المزيد من الدعم والمفاجآت لمنصّة Xamarin التي كان أوّلها هو جعلها مجّانيّة للاستخدام الشخصيّ أو للفرق البرمجيّة الصغيرة. سنبدأ اعتبارًا من الدرس القادم في هذه السلسلة التعليميّة، تنصيب برنامج Visual Studio 2015 وبدء العمل مع Xamarin.1 نقطة
-
سنتابع العمل في سلسلة برمجة تطبيقات الأجهزة المحمولة باستخدام Xamarin، حيث سنعمل في هذا الدرس على تنزيل وتنصيب برنامج Visual Studio 2015 Community الذي يأتي بشكل مجّاني من مايكروسوفت. حيث أنّ منصّة Xamarin أصبحت تأتي مع Visual Studio كميّزة من المزايا الاختياريّة التي من الممكن اختيارها أثناء تنصيب Visual Studio، وذلك بعد استحواذ مايكروسوفت على شركة Xamarin. تنزيل وتنصيب Visual Studio 2015 Community أنصح أن يكون التنصيب على ويندوز 10 أو ويندوز 8.1. انتقل إلى صفحة تنزيل بيئة التطوير Visual Studio 2015. كما في الشكل التالي: سنختار الإصدار Community من اليسار، لذلك فانقر الزر Download Community Free. سيعمل المتصفّح على تحميل ملف تنفيذي صغير اسمه vs_community.exe وهو برنامج الإعداد الذي سيعمل على تنصيب Visual Studio Community. سيشّغل المتصفّح هذا البرنامج بعد تنزيله فورًا، لذلك سيعطيك ويندوز تحذير أمان أنّه برنامج تنفيذي، ويعرض عليك تشغيله أو إلغاء العمليّة. اقبل تشغيله من خلال نقر الزر Run كما في الشكل التالي: سيعمل برنامج الإعداد ويبدأ بجلب بيانات التنصيب من الإنترنت. قد يستغرق ذلك القليل من الوقت قبل أن تحصل على النافذة في الشكل التالي، التي تخيّرنا بين خيارين للتنصيب: افتراضي Default ومخصّص Custom: انقر الخيار المخصّص Custom ثمّ انقر Next. لينتقل برنامج الإعداد إلى نافذة المزايا المطلوب تنصيبها. انتقل إلى العقدة Cross Platform Mobile Development وانشرها لتصل إلى الميّزة (C#/.NET (Xamarin v4.0.4 وهو الإصدار الحالي لمنصّة Xamarin حين كتابة هذا الدرس. قد يختلف هذا الإصدار بالنسبة إليك. انقر صندوق الاختيار بجوار هذه الميّزة، سيؤدّي ذلك إلى اختيار مزايا أخرى بشكل تلقائي. في الحقيقة سيكون حجم حزمة البيانات التي ستُنزّل من الإنترنت كبيرة نسبيًّا. بالنسبة لهذه السلسلة لن نحتاج إلى جميع هذه المزايا، لذلك انتقل إلى العقدة Programming Languages وانشرها، وأزل الإشارة من صندوق الاختيار الموجود بجانب ++Visual C. انقر الزر Next لنصل إلى المرحلة النهائيّة قبل البدء بعمليّة التنصيب، وهي المرحلة التي تلخّص ما سيقوم به برنامج الإعداد. انقر الزر Install لتبدأ عمليّة التنصيب التي ستأخذ بعض الوقت بحسب سرعة الإنترنت لديك. ستتضمّن عملية التنصيب تحميل حزمة التطوير البرمجيّة SDK الخاصة بأندرويد، بالإضافة إلى تثبيت واجهتين برمجيّتين أو أكثر افتراضيًّا مثل API 19 و API 21. على العموم يمكن تثبيت الواجهات البرمجيّة التي ترغبها بعد انتهاء التنصيب وذلك من خلال مدير الحزم والواجهات في أندرويد Android SDK Manager الذي يأتي مع حزمة التطوير البرمجيّة SDK. اقرأ هذا المقال هنا على أكاديميّة حسّوب للمزيد من المعلومات حول الواجهات البرمجيّة API ودعمها للأجهزة المشغّلة لأندرويد. التشغيل الأول لبيئة التطوير Visual Studio عند تشغيل بيئة التطوير Visual Studio 2015 للمرّة الأولى، سيطلب منك Visual Studio تسجيل الدخول باستخدام حساب بريد إلكتروني من مايكروسوفت (كحساب بريد إلكتروني على Hotmail مثلًا) كما في الشكل التالي: انقر الزر Sign in لتسجيل الدخول، لتحصل على النافذة الخاصّة بإدخال البريد الإلكتروني. أدخل البريد الإلكتروني ثم انقر Continue وإذا طلب منك Visual Studio أن تحدّد نوع البريد الإلكتروني، فاختر شخصيّ Personal Email. بعد ذلك ستصل إلى نافذة تطلب منك كلمة المرور لحساب البريد الإلكتروني الذي أدخلته قبل قليل. أدخل كلمة المرور، ثم انقر Sign in، لتصل إلى النافذة الرئيسيّة لتطبيق Visual Studio كما في الشكل التالي: إنشاء مشروع جديد من النافذة الرئيسيّة لبيئة التطوير Visual Studio، انقر القائمة File من الأعلى، واختر منها New ثم Project لإنشاء مشروع جديد، ستحصل على النافذة التالية: اختر من الشجرة التي تظهر على الجانب الأيسر الخيار: Cross-Platform (قد تحتاج لنشر بعض العقد لتصل إليه). ثم اختر نوع المشروع Blank App Xamarin.Forms) Portable) من القسم الأوسط للنافذة وذلك من أجل اختيار مكتبة الأصناف المحمولة PCL مع هذا التطبيق. ثمّ أدخل الاسم HelloWorld في حقل الاسم Name من الأسفل، ثم انقر OK. سيستغرق الأمر وقتًا قليلًا ليعمل Visual Studio على إنشاء عدّة مشاريع ضمن الحل Solution الحالي. بالنسبة إليّ (أستخدم نظام التشغيل Windows 10) فقد حصلت على خمسة مشاريع ضمن هذا الحل وهي: (HelloWorld (Portable HelloWorld.Droid HelloWorld.iOS (HelloWorld.Windows (Windows 8.1 (HelloWorld.WinPhone (Windows Phone 8.1 تظهر هذه المشاريع ضمن مستكشف الحل Solution Explorer في الجانب الأيمن من النافذة (إذا لم يكن ظاهرًا فيمكنك إظهاره من القائمة View ثم اختيار Solution Explorer). انظر الشكل التالي: في الحقيقة لن نهتم في هذه السلسلة سوى بالتطبيقات التي تعمل على أندرويد، لذلك سنحتفظ بالمشروعين (HellowWorld (Portable و HellowWorld.Droid ونحذف باقي المشاريع. انقر بزر الفأرة الأيمن على المشروع HelloWorld.iOS ثم اختر Remove لإزالته. كرّر نفس العمليّة بالنسبة للمشروعين (HelloWorld.Windows (Windows 8.1 و (HelloWorld.WinPhone (Windows Phone 8.1. ملاحظة: قد تختلف المشاريع التي تظهر عندك بشكل طفيف. على أيّة حال احرص على وجود مشروعين فقط وهما HelloWorld.Droid و (HelloWorld (Portable. تشغيل تطبيق أندرويد الأول لتشغيل تطبيقات أندرويد فإنّنا نحتاج إلى جهاز ذكي يشغّل أندرويد (بصرف النظر عن الإصدار) أو أن يتوفّر لدينا محاكي Emulator يعمل على محاكاة عمل هذا الجهاز ولكن على حاسوبنا الشخصي. توفّر مايكروسوفت محاكٍ Emulator خاص بها: Visual Studio Emulator For Android، وذلك لمحاكاة عمل تطبيقات أندرويد على جهاز الحاسوب بدون الحاجة إلى وجود جهاز فيزيائي متصل بالحاسوب. يُعتبر هذا المحاكي برأيي أفضل من المحاكي الافتراضي الذي يأتي مع حزمة التطوير الخاصّة بأندرويد من حيث الأداء. وعلى أية حال، فستحتاج إلى تفعيل ميزة HAXM التي تأتي مع معالجات Intel، والتي يحتاجها المحاكي الافتراضي لتسريع أدائه. انظر إلى هذا الرابط لتعرف المزيد عن هذا الموضوع. لنشغّل تطبيقنا الأوّل ضمن المحاكي الخاص بمايكروسوفت، سيظهر لك أعلى نافذة بيئة التطوير شريط صغير يحتوي على اسم المحاكي الذي سيتم تشغيله. انظر إلى الشكل التالي: لاحظ بأنّ المحاكي الذي لديّ يدعم الواجهة البرمجيّة API 19 ولا بأس في ذلك. يمكنك دعم أي واجهة برمجيّة ترغبها، باستخدام Android SDK Manager. كلّ ما فعلته أنّني تركت الإعدادات الافتراضيّة كما هي. انقر السهم الأخضر الصغير للتشغيل في وضع التنقيح debugging mode (أو يمكنك اختيار الأمر Start Debugging من القائمة Debug أو اضغط F5). سيستغرق الأمر قليلًا من الوقت حتى تحصل على شكل شبيه بما يلي: لاحظ الرسالة الترحيبيّة !Welcome to Xamarin Forms في وسط الشاشة. مبروك لقد حصلت على برنامجك الأوّل! أوقف الآن تشغيل البرنامج باختيار الأمر Stop Debugging من القائمة Debug (أو اضغط Shift+F5). انتقل إلى مستكشف الحل Solution Explorer وانشر المشروع (HelloWorld (Portable ثمّ انقر على الملف App.cs وهو الملف الأساسيّ في أيّ تطبيق من تطبيقات Xamarin. ستجد ضمنه الشيفرة التالية: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Xamarin.Forms; 7 8 namespace HelloWorld 9 { 10 public class App : Application 11 { 12 public App() 13 { 14 // The root page of your application 15 MainPage = new ContentPage 16 { 17 Content = new StackLayout 18 { 19 VerticalOptions = LayoutOptions.Center, 20 Children = { 21 new Label { 22 XAlign = TextAlignment.Center, 23 Text = "Welcome to Xamarin Forms!" 24 } 25 } 26 } 27 }; 28 } 29 30 protected override void OnStart() 31 { 32 // Handle when your app starts 33 } 34 35 protected override void OnSleep() 36 { 37 // Handle when your app sleeps 38 } 39 40 protected override void OnResume() 41 { 42 // Handle when your app resumes 43 } 44 } 45 } لاحظ الصنف App في السطر 10. يرث هذا الصنف من الصنف Application الذي يمثّل التطبيق في Xamarin.Forms. أيّ تطبيق ننشئه في Xamarin.Forms يجب أن يرث من هذا الصنف. تقع بانية الصنف App في الأسطر من 12 حتى 28 وفيها يتمّ تعيين الصفحة الرئيسيّة التي سيظهرها التطبيق عند تشغيله. أيّ صفحة من صفحات التطبيق ستكون عبارة عن كائن من صنف يرث من الصنف ContentPage (صفحة محتوى). يمكن أن تحتوي هذه الصفحة على أيّ شيء يخطر ببالك من مربّعات النص والأزرار وأشرطة التمرير وغيرها من الأدوات. لاحظ أنّنا في السطر 15 (ضمن بانية الصنف App) قد أسندنا كائنًا جديدًا من الصنف ContentPage إلى الخاصيّة MainPage وهي خاصيّة تتبع الصنف Application (الذي يرث منه الصنف App). تستخدم الشيفرة الموجود هنا أسلوب الإنشاء المختصر للكائنات، فكلّ شيء يتمّ هنا من خلال عبارة برمجيّة واحدة. حيث نسند الخصائص للكائنات الجديدة المُنشأة مباشرةً عند إنشاء هذه الكائنات. فمن خلال الشيفرة الموجودة في الأسطر بين 15 و 27 كرّرنا هذا الأسلوب ثلاث مرّات، وذلك من أجل كائنات جديدة من الأصناف ContentPage و StackLayout و Children. ملاحظة يُعتبر الإسناد المختصر للخصائص عند إنشاء كائنات جديدة، من التقنيّات المهمّة التي تبسّط الشيفرة البرمجيّة إلى حدّ كبير. وكيف تنعش ذاكرتك، إليك المثال البسيط التالي. بفرض أنّه لدينا الصنف Student الذي يحتوي على الخصائص التالية: FirstName و LastName و Age. عند إنشاء كائن جديد من الصنف Student يمكننا استخدام العبارة البرمجيّة التالية: Student student = new Student { FirstName = "Ahmad", LastName = "Shareef", Age = 16 }; ففي هذه الحالة ننشئ كائن جديد من الصنف Student وبنفس الوقت نُسند القيم المناسبة لخصائصه. سنؤجّل الحديث عن التوابع OnStart و OnSleep و OnResume لنتحدّث عنها لاحقًا في هذه السلسلة، رغم أنّ أسمائها توحي بوظائفها التي تُعتبر مفيدة ومهمّة في عمل التطبيق. الخلاصة تعلّمنا في هذا الدرس كيفيّة تنزيل وتنصيب Visual Studio 2015 Community مع إضافة قابليّة تطوير تطبيقات لأندرويد باستخدام Xamarin. لاحظ أنّني قد تركت الأمور تسير بشكلها الافتراضيّ قدر المستطاع، لأنّه كما هو واضح هناك العديد من الإجراءات كي تصبح بيئة التطوير جاهزة للعمل، وللبدء بتطوير تطبيقات تعمل على أندرويد وغيره من أنظمة التشغيل باستخدام سي شارب #C و Xamarin.1 نقطة
-
أهلًا بك أخي مؤمن أحب أنّ أضيف شيء بسيط على رد الأخ هشام صراحًة لن تجد جوابًا كافيًا أو بسيط حول هذا الأمر، فكل لغة لها إيجابيات وسلبيات وكل لغة تقوم بمهام مُحددة وفريدة من نوعها. كل لغة لها مجموعة فريدة من الأوامر وكلمات وجُمل خاصة لتنظيم أوامر البرنامج. لغة البرمجة PHP: تُعتبر اللغة الأكثر شُهرة في تطوير الويب. PHP وهي اختصار لكلمة (Hypertext PreProcessor) وهي لغة برمجة الخادم، وتُعتبر من أقوى الأدوات لانشاء مواقع حيوية وتفاعلية. وهي لغة مُستخدمة على نطاق واسع في كل شيء من المدونات البسيطة إلى المواقع الأكثر شعبية في العالم. مزايا لغة البرمجة PHP: هي منصة مجانية تم طرحها بموجب ترخيص PHP سهلة التعلُم (سوف تتعلمها بمدة قصيرة لو أحببتها) لديها شعبية كبيرة مما أدى إلى انشاء مُجتمع كبير لها من المُستخدمين والمُطورين لديها قاعدة بيانات واسعة ومدعومة توفر لك عدد كبير من الامتدادات المُتاحة واكواد المصدر تسمح لك بتنفيذ التعليمات البرمجية في بيئات مُقيدة تُعتبر بديلًا رائعًا للمنافسين مثل ASP من مايكروسوفت يُمكن نشرها على معظم خوادم الويب تعمل تقريبًا على كافة أنظمة التشغيل والمنصات عيوب لغة البرمجة PHP: لا تصلح لصنع تطبيقات سطح المكتب يجب أن تقوم بالاتصال بقواعد البيانات حتى تستطيع استخدام mysql_real_escape_string، ولا يُمكن استخدامها بدون عمل اتصال. لغة PHP غير مُستقرة لا تقوم باتباع نظام تسمية مُعين أما لغة البرمجة روبي _Ruby: هي لغة برمجة كائنية متعددة الاستخدام. وتمتاز اللغة بكونها لغة شيئية نقية كما تمتاز باحتوائها على كثير من خواص اللغات الوظيفية (المصدر) ميزات لغة البرمجة روبي _Ruby: مفتوح المصدر تعمل على منصات متعددة يمكن أن تكون جزءًا لا يتجزأ في لغة توصيف النص التشعبي (HTML) لغة عالية المستوى جدا (VHLL) تقنيات فائقة ومتقدمة في معالجة سلسلة النص تُمكنك من الإتصال بسهولة في كل من DB2, MySQL, Oracle, وSybase ويوجد الكثير من الأمور الإيجابية حول للغة مثل سهولة تطوير التطبيقات والقدرة على كتابة المكتبات الخارجية في روبي ولغة البرمجة C، وهي آمنة أكثر من لغة البرمجة PHP. عيوب لغة البرمجة روبي _Ruby: تفتقر إلى الموارد الإعلامية وقت وحدة المعالجة المركزية مقارنًة مع لغات البرمجة الأخرى التطويرات والتحديثات بها بطيئة ووفقا لموقع روبي، فهي تحتل المرتبة رقم 10 بين لغات البرمجة الأكثر شعبية في جميع أنحاء العالم.1 نقطة
-
يُمكنك تحقيق مبتغاك باستعمال كل من جوهرة pg الخاصة بـ postgresql وجوهرة taps. وهذه الطريقة تحافظ على البيانات كما هي وتنقلها من نمط SQLite إلى Postgresql. أولاً ثبّت Postgresql : حدّث قائمة الحزم: sudo apt-get update ثبّت Postgresql والحزم التي تعتمد عليها: sudo apt-get install postgresql postgresql-contrib libpq-dev أنشئ مستخدما لقاعدة البيانات: sudo -u postgres createuser -s pguser استبدل pguser بأي اسم تريده على شرط أن تتذكّره. أنشئ قواعد البيانات لكل من بيئة التطوير والاختبار: create database اسم_المشروع_development; create database اسم_المشروع_test; حدّث ملف Gemfile: gem 'sqlite3' gem 'pg' gem 'taps' طبق الأمر: bundle install غيّر ملف database.yml: #development: # adapter: sqlite3 # database: db/development.sqlite3 # pool: 5 # timeout: 5000 development: adapter: postgresql encoding: unicode database: اسم_المشروع_development pool: 5 username: اسم_المستخدم_الخاص_بpostgresql password: كلمة_المرور_الخاصة_بPostgresql password: #test: # adapter: sqlite3 # database: db/test.sqlite3 # pool: 5 # timeout: 5000 test: adapter: postgresql encoding: unicode database: اسم_المشروع_test pool: 5 username: اسم_المستخدم_الخاص_بPostgresql password: كلمة_المرور_الخاصة_بPostgresql من سطر الأوامر شغّل خادوم taps على قاعدة بيانات SQLite: taps server sqlite://db/development.sqlite3 user passwordالجوهرة taps تحتاج إلى اسم مستخدم وكلمة مرور، SQLite لا تملكهما، لكن يُمكنك استخدام "user” كاسم للمستخدم و "password” لكلمة المرور. قم بدمج البيانات: taps pull postgres://اسم_المستخدم@localhost/اسم_المشروع_development http://user:password@localhost:5000 أعد تشغيل خادوم الويب : rails s ثم في الأخير تخلص من جوهرتي sqlite و taps لأننا لم نعد في حاجة إليهما. #gem 'sqlite3' gem 'pg' #gem 'taps'1 نقطة