مصطفى القباني
الأعضاء-
المساهمات
89 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو مصطفى القباني
-
يستخدم السطر الآتي لطلب التاريخ والوقت: DateTime.Now.ToString() يقوم السطر الآتي بطباعة التاريخ والوقت داخل الconsole: Console.WriteLine(DateTime.Now.ToString()); ويمكنك إستخدام نفس الدالة لعرض التاريخ والوقت داخل الform.
-
هناك 3 أماكن لكتابة الstyle: inline internal external بالنسبة لأولية تطبيق الstyle على العنصر تكون الأولوية للinline style مثل: <p style="color:blue"> I'm Blue </p> يليه الinternal مثل: <html> <head> <style> p{ color:red; } </style> </head> <body> <p>I'm red</p> </body> </html> يليه الexternal مثل: <html> <head> <link rel="stylesheet" href="style.css"> </head> <body> <p></p> </body> </html> الأولوية في تطبيق الstyle تكون للinline ثم للinternal ثم للexternal. على سبيل المثال إذا كان لدينا الكود الآتي: <html> <head> <style> p{ color:red; } </style> </head> <body> <p style="color: blue;"></p> </body> </html> هل سيكون لون الوسم p أزرق أم أحمر؟ سيكون لونه أزرق لأن الأولوية تكون للinline style، وهكذا بالمثل على الexternal stylesheet.
-
العفو لا شكرا على واجب، بالنسبة للخطأ كان هناك خطأ في الكتابة جرب مرة أخرى: $stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?"); $stmt->bind_param("ss", $phone, $password); $response = $stmt->execute(); بالنسبة لتغير باقي الكود أم لا، أعتقد أنه لا يجب التغيير فيه، للتأكد من ذلك عليك مقارنة الreturn type للmysqli_query المستخدمة في الكود الأصلي، والmysqli_stmt::execute
- 4 اجابة
-
- 1
-
تحياتي أستاذ مروان في الكود يوجد جملة SQL وحيدة وهي عرضة للSQL injection وهي: $sql = "SELECT * FROM user WHERE phone='$phone' AND password='$password' "; وهي عرضة للSQL injection بسبب المتغيرات $password و $phone. لذلك عليك تجهيز هذه الجملة أولا عن طريق الprepared statements. نقوم بتجهيز الجملة بوضع علامة إستفهام مكان المتغيرات كالآتي: $stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?"); وبعد ذلك نقوم بربط علامات الإستفهام بالمتغيرات التي نريد تمريرها إلى الجملة كالآتي: $stmt->bind_param("ss", $phone, $password); إذا كان المتغير phone$ من النوع int يجب تغيير الparameter الأول إلى "is" وتصبح الجملة كالآتي: $stmt->bind_param("is", $phone, $password); بالتالي يكون الكود الكامل لتجهيز الجملة وتنفيذها هو: $stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?"); $stmt->bind_param("ss", $phone, $password); $result $stmt->execute(); ويمكنك التعامل مع الresult المرجعة.
- 4 اجابة
-
- 1
-
تحياتي أستاذ مروان في النموذج الأول، لنفرض أن المتغير $studentid قيمته تساوي الstring التالي: "1; DROP TABLE student;" وعند ترجمة الطلب الآتي: $CheckSQL = "SELECT * FROM student WHERE studentid='$studentid'"; يصبح: SELECT * FROM student WHERE studentid=1; DROP TABLE student; لذلك الكود به ثغرة sql injection. لتجنب ذلك لابد من إستخدام الprepared statements و parameterized queries. تنفيذ الprepared statement يكون على خطوتين، الأولى التجهيز prepare ثم التنفيذ execute.بما أنك تستخدم MySQLi يمكنك عمل ذلك عن طريق الآتي: $stmt = $mysqli->prepare("SELECT * FROM student WHERE studentid = ?") $stmt->bind_param('s', $studentid); $stmt->execute(); $result = $stmt->get_result(); في السطر الثاني ال's' تشير إلى أن نوع المتغير هو string، إذا كان studentid هو int عليك تغييره إلى 'i'. بهذه الطريقة تصبح العبارة آمنة، بسبب أن جزء الأمر مفصول عن جزء الداتا، والسبب في أي sql injection هو خلط البيانات بالأوامر، حيث يمكن تمرير أمر إلى الداتابيز في شكل داتا. أي أمر ترسله إلى الداتابيز سواء إضافة أو قراءة، ويكون في هذا الأمر parameter، يجب تجهيزه بهذه الطريقة. بالتوفيق
- 4 اجابة
-
- 1
-
بالنسبة لموقع مستقل، يمكنك إرفاق أي نوع من الملفات إلى العميل مباشرة في حال التواصل من صفحة المشروع، عن طريق الضغط على إرفاق الملفات كما في الصورة المرفقة. أو يمكنك إضافة مقطع الفيديو لعملك في معرض أعمالك على صفحتك الشخصية، عن طريق الضغط على ملفات مرفقة إضافية ورفع ملف الفيديو المرغوب.
- 4 اجابة
-
- 1
-
تحياتي أستاذة هبة، إحدى الطرق هو أنك تخبري العميل صراحة أنك مستعدة لتنفيذ المشروع بمقابل مادي قليل، ولكن في المقابل أن يعطيكي تقييم مناسب لجودة العمل عند الإنتهاء. لاحظي أن هذا سيتطلب منك أن تبذلي جهد كبير في مقابل مادي قليل، ولكنه سيجعلك تتخطي عقبة الحصول على أول تقييم، ويمكنك البدء في طلب المقابل المناسب في المشاريع القادمة. أعتقد أنه من المفيد أيضاً إفتراض حسن النية للعميل، فعند طلبه عينة مجانية، يمكنك العمل لمدة ساعة مثلاً لوضع الخطوط المبدئية في العمل، وإرسالها كعلامة على الجدية، مع مراعاة أن المنافسة تكون شديدة وبالتالي سيكون عليكي أن تتقبلي أن بعض العملاء لن يقوموا بالرد. ويبقى أهم جزء بالتأكيد هو وضع الأعمال السابقة وعرضها بصورة جيدة. بالتوفيق
- 3 اجابة
-
- 2
-
تحياتي أستاذ صالح، يمكنك الإطلاع على مجموعة خطوط google fonts العربية، أعتقد أنك ستجد فيها ما يناسبك. https://fonts.google.com/?subset=arabic بالتوفيق
- 2 اجابة
-
- 1
-
تحياتي أستاذ عباس. الكود المكتوب به أخطاء، ولكن يبدو أن ما يجب أن يقوم بعمله هو حساب المجموع والمتوسط لأول n من الأعداد، والمطلوب تحويله إلى مجموعة من الدوال. يمكن عمل الآتي كالتالي: أولا عمل دالة تقوم بحساب مجموع أول n من الأعداد: int get_sum(int n){ int sum =0; for(int j=1; j<=n; j++) { sum = sum + j; } return sum; } وفيها نقوم بعمل loop ونقوم بجمع عداد الloop كل مرة وأضافته على المجموع، وبإنتهاء الloop نكون قد حصلنا على المجموع. ثانياً عمل دالة تقوم بحساب المتوسط لأول n من الأعداد، وتقوم بداخلها بإستخدام الدالة sum كالآتي: float get_avg(int n){ int sum; float avg; avg = (float)get_sum(n)/n; return avg; } وفيها قمنا بحساب المتوسط لأول n من الأعداد وهو حسب التعريف المجموع مقسوم على العدد، بالتالي قمنا بإستخدام دالة حساب المجموع، وقمنا بالقسمة على n، مع مراعاة عمل casting إلى النوع float عند قسمة integer على integer لنحتفظ بالأجزاء العشرية. ويمكن إستخدامهم من الدالة main كالآتي: int main() { int n; float avg; cout<<" Enter N : "; cin>>n; cout<<" The sum= "<<get_sum(n)<<endl; cout<<" The average= "<<get_avg(n)<<endl; return 0; } وفيها قمنا بطلب إدخال عدد من المستخدم، وبعد إدخال العدد قمنا بإستخدام الدالتين الذي قمنا بتعريفهم لحساب المجموع وحساب المتوسط، وطباعة النتيجتين. الكود بالكامل موجود هنا. بالتوفيق.
- 2 اجابة
-
- 1
-
تحياتي الDOM Node interface هو class محوري يتم الإشتقاق منه من العديد من الobjects الأخرى. من أهم الobjects التي تشتق من Node هو Document و Element. الElement interface هو class عام يشتق منه جميع الelement objects داخل الdocument. على سبيل المثال فكلا من HTMLElement interface وSVGElement interface يقوما بالإشتقاق من الElement interface، الذي بدوره يقوم بالإشتقاق من الNode interface. لاحظ أن مفهوم الإشتقاق هنا هو المفهوم المتعارف عليه في البرمجة الشيئية object oriented programming. بالنسبة لطريقة الكتابة والفرق بين: Node node هو أن الأولى تشير إلى الbase class، بينما الثانية تشير إلى إحدى الnodes داخل الDOM مثلاً p node أو a node. يمكنك القراءة اكثر من هنا: Node Interface, Element Interface, مدخل إلى الDOM، البنية الشجرية للDOM. تحياتي وبالتوفيق.
- 2 اجابة
-
- 2
-
تحياتي الكود المطلوب: #include <iostream> using namespace std; int main() { int i,fact=1,number; cout<<"Enter any Number: "; cin>>number; for(i=1;i<=number;i++){ fact=fact*i; } cout<<"Factorial of " <<number<<" is: "<<fact<<endl; return 0; } قمنا بتعريف المتغيرات i,fact, number. المتغير i سنقوم بإستخدامه كعداد الloop. المتغير fact سنقوم بتخزين القيمة المحسوبة فيه، والمتغير number لوضع الرقم المدخل من المستخدم. بعد ذلك قمنا بعمل loop تقوم بضرب الرقم بداية من 1 إلى الرقم المدخل، وهو التعريف لعملية الfactorial. يمكنك تجربة الكود من هنا. بالتوفيق
- 1 جواب
-
- 1
-
تحياتي أستاذ كامل سبب فشل import HTML و JSON هو أن البيانات تعرض بشكل dynamic عن طريق الJavascript، وتظهر فقط عند فتح الموقع من خلال المتصفح. للتأكد من ذلك قم بتجربة الآتي عن طريق بايثون: import requests import os target_link = 'https://fantasy.premierleague.com/leagues/1767595/standings/h' response = requests.get(target_link) print('the output will be in {}'.format(os.getcwd())) open('output.html','w').write(x.text) قمنا في الكود السابق بإرسال request، عن طريق مكتبة requests ثم كتابة الصفحة المرجعة إلى ملف output.html لفحصه. قم بفتح هذا الملف وستجد أن الجداول غير موجودة، وهذا يعني أن الجداول تظهر بإستخدام الJavascript ويتطلب إستخدام المتصفح. الأداة التي يمكن إستخدامها في هذه الحالة هي Selenium، ويمكن استيراد البيانات كالآتي: import selenium.webdriver as webdriver driver = webdriver.Chrome() target_link = 'https://fantasy.premierleague.com/leagues/1767595/standings/h' driver.get(target_link) import pandas as pd tables_in_page = pd.read_html(driver.page_source) for table in tables_in_page: print(table) في الكود السابق قمنا بإستخدام مكتبة pandas وهي مكتبة مهمة في علم البيانات، وقمنا بإستخدام الدالة read_html وهي تقوم بإستخراج الجداول من كود الhtml المعطى لها. وبهذه الطريقة قمنا بجمع البيانات الموجودة في الجدول وهي الآن موجودة في المتغير tables_in_page. اللغة المستخدمة :Python3 المكتبات المستخدمة: requests , selenium, pandas
- 2 اجابة
-
- 1
-
يمكن كان هناك حرف غير ظاهر فبعض الحروف الunicode تكون مخفية، وكان بالخطأ هناك حرف مخفي في اسم الملف. تحياتي وبالتوفيق إن شاء الله.
- 12 اجابة
-
- 1
-
تحياتي مبدأياً تأكد من وجود الملف في المكان بالفعل بهذا الإسم. ثانيًا جرب تعديل المسار إلى: 'C:/Users/HP/re/Train.txt' إذا لم تعمل، يمكنك معرفة الcurrent working directory ووضع الملفات هناك كحل مؤقت. import os print(os.getcwd()) هذا السطر سيخبرك بالcurrent working directory، ويمكنك وضع الملفات هناك وفتحها عن طريق: open('Train.txt')
-
تحياتي أستاذ أحمد الرسالة تخبرك أن الخطأ هو في جملة الSQL المكتوبة. جرب تغيير الجملة إلى: SELECT * FROM `store`; فمن الممكن أن يكون store كلمة محجوزة، لذلك عليك عمل escaping لأسم الtable.
-
تحياتي أستاذ أحمد أعتقد أن المشكلة في ترتيب الcolumns، فأنت أفترضت أن ترتيب الأعمدة في الrow المستدعى من الداتابيز هي: No Name Salary Dept Phone Address HIDate BIDate أعتقد أن هذا الترتيب ليس الترتيب الصحيح، لمعرفة الترتيب الصحيح يمكنك عمل print أو وضع breakpoint بإستخدام الdebugger، للتعرف على ترتيب القيم في الrow المستدعى. يمكنك تجربة تعديل هذا السطر، إذا ظهر المرتب والقسم في المكان الصحيح إذا بالفعل إفتراضك لترتيب القيم في الrow المستدعى هو سبب المشكلة: txtwDept.setText(TTT.getValueAt(row,5).toString()); txtwSalary.setText(TTT.getValueAt(row,3).toString()); بالتوفيق.
-
تحياتي أستاذ إبراهيم يمكن عمل كل الأشياء المذكورة بإستخدام جافاسكريبت، ولكن هناك لغات وframeworks مهيئة أكثر لكل وظيفة. فعلي سبيل المثال Javascript في الطبيعي تعمل داخل المتصفح، بالتالي لا يمكن الوصول إلى أشياء مثل نظام التشغيل والملفات على الجهاز، لذلك سوف تحتاج إلى لغة أخرى مهيئة لعمل تلك الأشياء مثل Python أو غيرها. ولكن نظرياً فإن أية لغة برمجة هي مثل أي لغة برمجة أخرى، فيما يعرف في علم الحاسوب بTuring Completeness، ولكن هذا نظرياً فقط، فعملياً ستجد أن بعض اللغات مهيئة لعمل بعض الأشياء بالتغاضي عن أشياء أخرى، بسبب الأدوات والبيئة التي تعمل خلالها اللغة. على سبيل المثال لغة Javascript يمكن فصلها عن المتصفح وإستخدامها في بيئة أخرى في NodeJS بالنسبة لأي اللغات التي يجب أن تتعلمها لتشعر بالثقة، أنا أرى أن لغة مثل C أو C++ هي لغة صعبة نسبياً ولكن سوف تعطيك فهم عميق للغات برمجة أخرى كثيرة، حيث أن كثير من اللغات تسمى C based languages أي أن طريقة كتابتها مشابهة لكتابة لغة C. من اللغات الC based: Javascript PHP Java وبالطبع أفضل طريقة لتعلم لغة ما هي إستخدامها لعمل برامج بسيطة، والمداومة يومياً على إستخدامها، فمثلا وضع ساعة للتعلم يومياً لمدة أسبوع، أفضل كثيراً جدا من وضع 7 ساعات ليوم واحد فقط في الأسبوع. وفي النهاية أتمنى أن تأخذ بعض الوقت للتأمل في الصورة المرفقة، وهي رسمة بيانية لما يعرف بمنحنى التعلم أو learning curve، وهي تعبر عن إتقان الفرد لشيئ ما بمرور الوقت، حيث أن في البداية يكون مقدار التعلم بطيئ للغاية، وفي تلك الفترة يتوقف معظم الأفراد عن المحاولة ويستسلمون، ولكن بعد فترة البداية البطيئة تأتي مرحلة التسارع، وهي الفترة الثانية في التعلم ويرى الفرد فيها نقلة كبيرة في مستواه وإلمامه بما يتعلمه. تحياتي وبالتوفيق إن شاء الله.
-
تحياتي أستاذ مروان، يمكنك تجربة إضافة هذا السطر في تعريف الActivity في ملف AndroidManifest.xml android:launchMode = "singleTop" أو: android:launchMode = "singleInstance"
- 26 اجابة
-
- 1
-
تحياتي أستاذ محمد، سأعطي حضرتك في هذا الرد الصورة العامة والتي قد تضع حضرتك على بداية الطريق. يمكنك تقسيم البرنامج أو النظام الذي ترغب في عمله إلى جزئين وهما: جمع البيانات، وإرسال الرسائل. بالنسبة لإرسال الرسائل فهي تعتبر الجزء السهل من النظام الذي ترغب في بناؤه، ويمكن عمله بإستخدام لغة مثل php أو Python. فبعد الإنتهاء من تجميع البيانات المرغوبة، وبناء القائمة بالأشخاص المرغوب التواصل معهم، يمكنك إستخدام مكتبة مثل Python yagmail لإرسال الإيميلات برمجياً، ويمكن لتحديد توقيت الإرسال إستخدام scheduler مثل Python APScheduler أو Linux cron ولكن لاحظ أنك قد تحتاج إلى عمل الemail server الخاص بك إذا زدت عن الحد الأقصى للرسائل المرسلة التي تقدمها مزودي خدمات الemail مثل gmail. بالنسبة لجزئية تجميع البيانات، هي الجزء الأكبر وفيها يتم تجهيز قاعدة بيانات، ثم إستهداف مواقع معينة بصورة تكرارية وتعبئة قاعدة البيانات. ولعمل هذا الجزء يجب إستخدام لغة برمجة مثل Python أو php أو Javascript، ومعرفة بسيطة بHTML والCSS selectors لأن البيانات التي يتم تجميعها تكون بداخل HTML elements. ولذلك لعمل نظام مثل المطلوب سوف تحتاج إلى معرفة التالي: 1- أساسيات HTML وCSS 2- إتقان لغة برمجة مثل Python وإحدى مكتباتها لتجميع البيانات مثل Selenium. 3- معرفة بأساسيات قواعد البيانات.
-
تحياتي أستاذة بسمة. الكود المطلوب: #include<iostream> #include<string> using namespace std; class Employee { private: string name; int weight; public: bool isOverWeight(){ return weight >90; } void getData() { cout<<"\nEnter name: "; cin>>name; cout<<"Enter weight: $ "; cin>>weight; } void putData() { cout<<"\nname: "<<name<<"\nweight: "<<weight; } }; //\////\////\////\////\////\////\////\////\////\////\////\// //\////\////\////\////\////\////\////\////\////\////\////\// class Manager : public Employee { private: string title; public: void getData() { Employee::getData(); cout<<"Enter title: "; cin>>title; } void putData() { Employee::putData(); cout<<"\ntitle: "<<title; } }; //\////\////\////\////\////\////\////\////\////\////\////\// //\////\////\////\////\////\////\////\////\////\////\////\// class Scientist : public Employee { private: int number_of_publications; public: void getData() { Employee::getData(); cout<<"Enter number of publications: "; cin>>number_of_publications; } void putData() { Employee::putData(); cout<<"\nnumber of publications: "<<number_of_publications; } }; int main() { Manager manager; Scientist scientist; manager.getData(); scientist.getData(); cout<<"\a "<<endl; // ’\a'produces the beep sound manager.putData(); cout<<endl; scientist.putData(); cout<<endl; Employee *staff[2] ; staff[0] = &scientist; staff[1] = &manager; for(int i = 0; i<2; i++){ if(staff[i]->isOverWeight()){ cout<<i<<" is overweight"; } else{ cout<<i<<" is NOT overweight"; } } return 0; } بالتوفيق.
- 3 اجابة
-
- 3
-
تحياتي، يمكن لحضرتك إستخدام مثل هذه الخدمة المجانية: https://free.currencyconverterapi.com/ ويوجد بالقائمة الليرة السورية SYP. لاحظ أن هناك حد أقصى للإستهلاك في الساعة وهو: Number of Requests per Hour: 100. إن كنت ترغب في عمل عدد كبير من الrequests يمكن إستخدام خدمة مدفوعة مثل: https://currencylayer.com/product ومنها يمكن عمل 10،000 request في الشهر مقابل 10 دولار. بالتوفيق.