-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Wael Aljamal
-
مرحبا، الحل الأفضل هو تعديل برمجة الإضافة لتسمح بإضافة الصور للأسئلة و الأجوبة .. يمكنك تجريب الحل التالي مع العلم أن موضوع التسيق يمكن أن يحوي مشاكل ويجب تعديله ليتناسب بشكل كامل مع الحل الذي تريده. في حال كان النص نفسه يعرض على المتصفح بدون معالجة أو اقتباس له، يمكننا وضع شيفرة برمجية مكان النص تؤدي لعرض صورة. <img src="img.jpg رابط عرض الصورة" alt="توصيف الصورة" width="العرض" height="الارتفاع"> مثال <img src="img_girl.jpg" alt="Girl in a jacket" width="500" height="600"> يمكنك وضع الشيفرة البرمجية السابقة مع الإجابة مه تحديد عرض و ارتفاع مناسبين مع رابط .. هذه الطريقة ستمكنك من عرض صورة في الموقع ولكنها ليست أفضل حل كما ذكرت. بالتوفيق
-
مرحبا يحيى، فكرة الحل هي فحص قيمة المتحول z عدة مرات و إعادة إدخاله من المستخدم و تكرار عملية فحص قيمته. سوف نستخدم في السطر 11 حلقة while بدل الشرط if و سنضيف تعليمة قراءة قيمة z مرة ثانية في آخر سطر ضمن الحلقة. مع تكرار عمل الحلقة سنقرأ القيمة البدائية => حلقة (( نختبر z => نستدعي البرنامج المطلوب حسب قيمة Z => نعود لقراءة Z )) البرنامج بعد التعديل: fun main(args: Array<String>) { println("000000") //// var z = readLine()!!.toString() while (isnumber(z)) { if (z!!.toInt() == 1) { } else if (z!!.toInt() == 2) { } else if (z!!.toInt() == 3) { } else if (z!!.toInt() == 4) { } else println("Error choice") // z قراءة جديدة لقيمة z = readLine()!!.toString() } println("Bad choice") exitProcess(0) } إذا لم يكن Z عدد (لن يدخل إلى الحلقة) إذا أدخلنا قيمة جديدة بعد اختبار قيمة z الأولى في نهاية الحلقة ستتم معالجها في التكرار التالي.. يمكنك تعديل البرنامج بالطريقة التي تريدها الفكرة الرئيسة استخدام الحلقة while وتكرار إدخال قيمة المتحول z بالتوفيق
- 1 جواب
-
- 1
-
مرحبا محمد، يمكننا فهم الشكل العالم لشجرة النجوم بتقسيمه لـ 3 أجزاء. الجزء الأول على اليسار : يمثل عدد الفراغات قبل النجوم. الجزء الثاني الأوسط : يمثل رسم النجوم و عددهم حسب رقم السطر الذي نحن فيه. الجزء الثالث الأيمن: مسؤول عن رسم سطر جديد (نهاية السطر) شرح البرنامج: #include <iostream> using namespace std; // إجرائية رسم النجوم void pattern(int n) { int i, k, flag = 1; // سنقوم بالاعتماد على حلقة واحدة ستعبر عن عدد الأسطر و الأعمدة // عدد المحارف المطلوبة للرسم إن كانت فراغات أو نجوم for (i = 1, k = 0; i <= 2 * n - 1; i++) { // الحالة الأولى على اليسار // نحن في موقع بعيد عن الشجرة ويجب رسم فراغ if (i < n - k) cout << " "; // الحالة الثانية في الوسط علينا هنا رسم نجمة // الشجرة متناوبة في مكان النجوم لذلك استعملنا متغير بولياني else { // ستتناوب قيمة العلم في كل مرة ندخل إلى هذا الجزء من الشيفرة البرمجية if (flag) cout << "*"; else cout << " "; flag = 1 - flag; } // الحالة الثالثة // نحن خارج الشجرةننهي السطر الحالي و نبدأ سطر جديد if (i == n + k) { k++; cout << endl; // N الشرط التالي يحدد نهاية الرسم في حال وصولنا للسطر رقم // 2 * n- 1 والعمود الأخير فيه أي الخلية صاحبة الرقم if (i == 2 * n - 1) break; // في حال كنا لم نصل للسطر الأخير فنكون في بداية سطر جديد ونعيد تهيأة المتغيرات i = 0; flag = 1; // لنرسم نجمة في بداية الشجرة للسطر الجديد } } } // تنفيذ البرنامج int main() { int n = 6; // استدعاء الإجرائية الخاصة بالرسم pattern(n); return 0; } بالتوفيق
- 2 اجابة
-
- 2
-
مرحبا عبد ااواحد، إن هرمية MVC قائمة على توزيع المهام البرمجية إلى 3 أقسام، وهي MODEL أي نماذج قواعد البيانات، وما تحتويه من صفوف و بيانات و استعلامات، آليات الإضافة و التعديل وكل ما يتعلق بقواعد البيانات، مهمتها الأساسية في التطبيق هي تزويدنا بالمعلومات التي نطلبها. تقوم Eloquent في إطار العمل Laravel بمخاطبة قاعدة البيانات وتنفيذ تعليمات SQL بشكل يتناسب مع ما قد كتبناه عند تعريفنا للأصناف التي ترث الصف Model. ((القسم الثاني، العرض VIEW، وهو كل ما يظهر للمستخدم على الشاشة، أساسه صفحات HTML و ماتتضمنه من تنسيقات و ايضا جافا سكربت وإطارات العمل خاصتها.)) القسم الثالث، المتحكم Controller وهو عنصر الربط بين ماسبق، حيث أنه يستلم طلبية الزبون/المستخدم و يطلب بعدها البيانات المتوافقة من MODEL و بعدها يوجه البيانات بالشكل الصحيح لواجهة العرض المناسبة VIEW. أما Migration: التهجير، هي المرحلة الوسيطة بين تعريف النماذج (الأصناف ضمن Model)، وعملية بناء قاعدة البيانات وما تحويه من جداول. إن بناء ملفات التهجير (بشكل تراكمي بدون تعديل الملفات السابقة) يسمح لنا بشكل ما بالتحكم بالتعديلات التي نقوم بها على قاعدة البيانات، حيث إن عمل ملف تهجير جديد مع تعديلات جزئية (إضافة حقل جديد مثلا أو تغيير نمط حقل) يسمح لنا بالتراجع عن هذه التعديلات أي عمل Rollback لآخر تعديل أو أكثر (التراجع عن تعديل كبير مثل حذف عمود من بنية الجدول سيؤدي لخسارة جميع البيانات) أي تسمح لنا بتعقب التعديلات على قاعدة البيانات (تفيد أكثر في حالة أنك تعمل مع فريق). تسمح لك عمليات التهجير بإضافة أو حذف الحقول في قاعدة البيانات الخاصة بك دون حذف السجلات الموجودة بالفعل.
- 3 اجابة
-
- 1
-
مرحبا مروان، إن عملية حماية اي تطبيق مهما كانت المنصة المبرمج فيها وبنسبة 100% هو أمر مستحيل. دائما يوجد طريقة للاختراق وإعادة تشكيل الشيفرة البرمجية الأصلية بعملية عكس الترجمة decompile. هل يمكن جعل عملية الهندسة العكسية غير مفيدة إلى حد ما؟ نعم، عن طريق جعل الشيفرة البرمجية أصعب للفهم من قِبل المخترق. تتم هذه العملية عن طريق تغيير اسماء الصفوف و المتحولات و الإجرائيات في الشيفرة البرمجية و إعطائها أسماءً طويلة و غير مفهومة. تدعى هذه العملية ب Obfuscating Dart code مثل إزالة الوضوح عن الشيفرة البرمجية، فبعد عملية الهندسة العكسية، ينتج برنامج غير واضح المعالم وصعب الفهم و التعقب. توفر Flutter طريقة خاصة لعمل هذا الأمر بشكل بسيط يمكنك تعلم الطريقة بتنفيذ تعليمة محددة أثناء بناء التطبيق من هنا: Obfuscating Dart code. هي طريقة سهلة وتعتبر تمرير بارامترات لعملية بناء التطبيق وليس أكثر بالنسبة للمستخدمين. بالنسبة لمنع حصول الهندسة العكسية، هو أمر غير ممكن. بالتوفيق
- 3 اجابة
-
- 1
-
مرحبا، سأكتب التعليقات المساعدة ضمن الشيفرة البرمجية: #!/usr/bin/env python3 import json # json تضمين مكتبة للتعامل مع ضيغة البيانات import locale # إعدادات البيئة المحلية LANG environment variable وإجرائيات مساعدة و اللغة import sys # تسمح بالوصول لخصائص ودوال في النظام system-specific parameters and functions import emails # مكتبة للتعامل مع البريد الإلكتروني import os # مكتبة للتعامل مع نظام التشغيل والوصول للملفات import reports # مكتبة للتعامل مع التقاير # قراءة ملف def load_data(filename): """Loads the contents of filename as a JSON file.""" # json_file تحميل المف في متحول باسم with open(filename) as json_file: # قراءة البيانات data = json.load(json_file) # إرجاع البيانات return data # إجرائية لتصنيف السيارات def format_car(car): """Given a car dictionary, returns a nicely formatted name.""" # تحويل قاموس يحوي بيانات السيارات لصيغة مرتبة منهم return "{} {} ({})".format( # الصانع - الموديل - سنة التصنيع car["car_make"], car["car_model"], car["car_year"]) # مصفوفة لتجميع بيانات السياراة car_sales ={} # حساب المبيعات السنوسة def calculate_sales_per_year(car, total_sales): # إذا كنا قد أضفنا هذه السنة للمصفوفة نقوم بتجميع تراكمي مع المجموع السابق if(car["car_year"] in car_sales): car_sales[car["car_year"]]=car_sales[car["car_year"]]+total_sales # المجموع الكلي يساوي المجموع الحالي else: car_sales[car["car_year"]]=total_sales # سيارة السنة أي الأكثر مبيعا مثلا def returns_most_popular_car_year(): # دليل السيارة المطلوبة key='' # عدد المبيعات value=0 # نبحث عن السيارة الهدف في المصفوفة for k in car_sales: if(car_sales[k]>value): # عندما نجد السيارة المطلوبة نخزن الدليل و القيمة key = k value = car_sales[k] # طباعة النتائج return "The most popular year was "+str(key)+" with "+str(value)+" sales." # معالجة البيانات def process_data(data): """Analyzes the data, looking for maximums. Returns a list of lines that summarize the information. """ # تحليل البيانات للبحث عن أكبر المبيعات و الإعادة على شكل قائمة locale.setlocale(locale.LC_ALL, 'en_US.UTF8') # تحديد اللغة max_revenue = {"revenue": 0} # تهيئة الإيرادات max_sales = {"total_sales": 0} # تهيئة الإجمالي # price * total_sales حساب الإيرادات بالطريقة التالية # وتحويل السعر من نص إلى رقم for item in data: # Calculate the revenue generated by this model (price * total_sales) # We need to convert the price from "$1234.56" to 1234.56 item_price = locale.atof(item["price"].strip("$")) item_revenue = item["total_sales"] * item_price # الاحتفاظ بأكبر الإيرادات if item_revenue > max_revenue["revenue"]: item["revenue"] = item_revenue max_revenue = item # TODO: also handle max sales # الاحتفاظ بأكبر المبيعات if item["total_sales"] > max_sales["total_sales"]: max_sales = item # TODO: also handle most popular car_year calculate_sales_per_year(item["car"],item["total_sales"]) # تشكيل الملخص و التقرير لما سبق summary = [ "The {} generated the most revenue: ${}".format( format_car(max_revenue["car"]), max_revenue["revenue"]), "The {} had the most sales: {}".format( format_car(max_sales["car"]), max_sales["total_sales"]), returns_most_popular_car_year() ] return summary # "ID", "Car", "Price", "Total Sales" تجميع البيانات في جدول مع الحقول def cars_dict_to_table(car_data): """Turns the data in car_data into a list of lists.""" table_data = [["ID", "Car", "Price", "Total Sales"]] for item in car_data: table_data.append([item["id"], format_car(item["car"]), item["price"], item["total_sales"]]) return table_data # pdf تصدير التقرير على شكل ملف def pdf_generator(summary,data): table_data=cars_dict_to_table(data) # وضع البيانات في صيغة جدول result='' # تجميع النتائج for line in summary: result=result+line+'<br/>' reports.generate("/tmp/reportCars.pdf", "Sales Summary for last month",result,table_data ) # إرسال إيميل بالنتائج def email_send_report(summary): sender = "automation@example.com" # تحديد المرسل receiver = "{}@example.com".format(os.environ.get('USER')) # تحديد المستقبل subject = "Sales summary for last month" # تحديد الموضوع body = '\n'.join(summary) # جسم الايميل # تهيئة الايميل مع إضافة المرفقات message = emails.generate(sender, receiver, subject, body, "/tmp/reportCars.pdf") # الإرسال emails.send(message) def main(argv): """Process the JSON data and generate a full report out of it.""" data = load_data("/home/student/car_sales.json") # تحميل الملف summary = process_data(data) # معالجة البيانات # TODO: turn this into a PDF report pdf_generator(summary,data) # pdf عمل تقرير على شكل # TODO: send the PDF report as an email attachment email_send_report(summary) # إرسال إيميل بالنتائج # تشغيل البرنامج if __name__ == "__main__": main(sys.argv) بالتوفيق
- 2 اجابة
-
- 2
-
مرحبا، إن موضوع الرد على الأسئلة و تنظيم الإجابات هو أمر خاص بالمدربين وهم مسؤولون عن الشرح والموافقة على التعليقات. شكرا لك
- 1 جواب
-
- 1
-
مرحبا، في حال امتلاكك لجهاز أندرويد، يفضل استخدامه لتشغيل التطبيق ويتم ذلك عبر وصله ب USB و تفعيل خيار المطور ووضع تصحيح USB من هاتف الأندرويد. ويوجد إضافات لأندرويد استديو تدعم تشغيل عملية التطوير في الهاتف في وضع WIFI أي ليس بالضروري إبقاء الوصلة بين الهاتف و الحاسوب يمكنك تثبيتها من قسم الإضافات في أندرويد استديو. و كما أخبرك الإخوة، استخدم دقة منخفضة وحدد الخصائص بما يتناسب مع مواصفات جهازك.
- 7 اجابة
-
- 1
-
مرحبا مروان، في الجزء الخاص قبل عرض القائمة ListView نختبر شرط طول القائمة flowers، فإذا كان اكبر من صفر نعرض عناصر القائمة نفسها، وفي حال غير ذلك نعرض عنصر آخر يحوي على نص الرسالة التي تريدها (او عنصر قائمة وحيد فيه الرسالة). اي استخدم عبارة if else عادية. إذا هو اختبار لوجود بيانات من عدمه، نضعه شرط في سياق بناء الواجهة widget و نستعرض ما هو مناسب للتطبيق. بالتوفيق
- 2 اجابة
-
- 1
-
يجب ان يعمل البرنامج في حال كانت الإعدادات صحيحة.
-
مرحبا، يخبرك أن كرت الشاشة GPU لديه مشاكل توافق مع المحاكي Emulator ويتطلب تحديث السواقة Driver التي تشغله ( Driver هو برمجية من الشركة المصنعة لقطع الحاسوب، يستخدمها نظام التشغيل لمعرفة الطريقة الاي سيتواصل بها مع هذه القطعة والتحكم بها) ولكل قطعة سواقة خاصة او اكثر (منها اغتراضي مع ويندوز و منها مصمم من الشركة المصنعة). افتح Device Manager و استعرض الأجهزة المتصلة مع نظام التشغيل، سيظهر لك جزء خاصة Graphical Memory Card من هذه السواقات. الآن وبعد تحديد السواقة في الشريط العلوي يظهر سهم للأعلى خاص بالتحديثات ، في حال الضغط عليه سيفتح نافذة للبحث عن تحديثات لبرنامج تشغيل كرت الشاشة لديك، قم بتحديثه. في حال لم تنفع الطريقة، أو لم يتوفر تحديثات هنا، قم بالبحث في الموقع الرسمي لشركة حاسوبك او موقع مايكروسوفت عن إصدار حديث للسواقة وقم بتحميله و تثبيته. و إذا عمل المحاكي بدون مشاكل، لاضرورة للتحديث. بااتوفيق
-
مرحبا أحمد، يتطلب تشغيل ال Emulator لديك تفعيل خاصية VT-x والتي يمكن تفعيلها بعد الدخول لإعدادات BIOS. عملية الدخول لإعدادات BIOS تختلف من جهاز حاسوب لآخر، عليك البحث في الانترنت عن هذه الجزئية. وكيفية تفعيل هذا الخيار، ممكن حضور فيديو شرح من على يوتيوب مثلا. إن هذه الخاصية مسؤولة عن تسريع النظام الافتراضي الذي نرغب بتشغيله جنبا إلى جنب مع النظام الأساسي. مثلا Emulator اندرويد يشغل نظام اندرويد كبيئة خاصة لتطبيقات أندرويد التي نشغلها عليه بإنشاء virtual machine. وهذا يحدث نفسه لكل عملية تشغيل نظام افتراضي على آخر و تسريع عميات ال Hardware ضروري لتعمل بسلاسة، وهذه ويدعمها عدد من المعالجات. مثلا لتشغيل نظام لينوكس او ويندوز آخر على حاسوبنا نستخدم أحيانا برامج البيئة الافتراضية مثل virtual box او VMware Workstation والتي عملها يكون بتحويل التعليمات التنفيذية من النظام الذي نشغله عليها إلى تعليمات نظام التشغيل الذي يشغل الحاسوب. حيث نعلم ان كل نظام حاسوبي له مجموعة تعليمات مختلفة يقوم المعالج بتنفيذها لكي يعمل الحاسوب. بالتوفيق
-
حسنا، الحل هو بتعديل قيمة المتحول isLoading في الأماكن المناسبة من البرنامج لديك. أي استدعاء الدوال التالية: void show() { setState(() => isLoading = true); } تغيير الحالة void dismiss() { setState(() => isLoading = false); } لضمان تثبيت القيمة الصحيحة للمتحول isLoading. استدعاء show في جميع الأماكن التي نريد إظهار ProgressIndicator و استدعاء dismiss للإخفاء. كما نقوم بربط الاستدعاء مع التنقل بين الواجهات (الشاشات screen) أحيان لا يقوم التطبيق بإعادة رسم الواجهة عند العودة لها وهكذا. مثال بسيط: نقوم باستدعاء الدوال في بدابة و نهاية كل دالة تقوم بالاتصال بالشبكة أو القيام بمهمة تأخذ بضع ثواني أو أكثر بهذا الشكل: function AnyFunction () { shwow() // Do your work dismiss() } هكذا نضمن ظهور / إخفاء العنصر حسب الطلب.
-
يفترض وجود دالة أو قيمة توقف عملهم، لكنه غير موجود. فالحل هو رسم أو حذف العنصر بشكل كامل (وحذف العنصر أفضل لتقليل مكونات العرض على الشاشة) (screen) و شجرة الواجهات widget tree, flutter. الطريقة الأولى بسيطة أيضا متحول بولياني مسؤول عن العرض و نغير قيمته بالاعتماد على تغيير الحالة state. بشكل عام وكتفكير مبرمج، استخدم الطريقة التي تعمل طالما أنها تعمل (لا داعِ لتغييرها) وهذا المنطق الذي قمت بشرحه بسيط وفعال ويمكنك تطبيقه لأي عنصر آخر. أما الطريقة : Navigator.pop(context); فأظن أنها تقوم بإضافة طبقة أعلى الشاشة (نظام المكدس) ثم يتم التخلص منها. الطريقة الأولى تعطي تحكم أفضل. اختر ما يناسبك بالتوفيق
- 6 اجابة
-
- 1
-
مرحبا، إن طريقة إنهاء عمل ProgressIndicator (متابع التقدم) هو عبارة عن إزالته من العرض بشكل كامل. يتم ذلك من خلال تحديث الحالة الذي يقوم بإعادة رسم عناصر الواجهة (وسيمون التحديث مع عدم تضمين هذا العنصر) فسيتم إخفائه. الحل: نعرف متحول خاص بعرض ProgressIndicator (متابع التقدم) مثلا: متحول يدل على التحميل: bool isLoading = false; وتابعين للتحكم به والربط مع العرض: العرض و الإخفاء تتم بتعديل الحالة.. void show() { setState(() => isLoading = true); } تغيير الحالة void dismiss() { setState(() => isLoading = false); } وعند رسم العناصر ضمن سياق الشيفرة البرمجية الطبيعية نفحص قيمة المتحول وعندها إما نرسم ProgressIndicator أو لا. child: isLoading? Center( child: CircularProgressIndicator(), ), : null // عنصر فارغ عند أي تغيير في الحالة state سيتم إعادة رسم الواجهة وفحص المتحول isLoading وعليه سيتقرر رسم متابع التقدم أو لا. بالتوفيق
- 6 اجابة
-
- 1
-
مرحبا، المشكلة تكمن في حزمة المطور JDK الخاصة بلغة Kotlin. تأكد من تحميلك لمكتبات اللغة و إضافتها لبيئة النظام windows environment path. هي موجودة ضمن المشروع ولكن تأكد من الربط بشكل صحيح. و استدعاء المكتبات ضمن الشيفرة البرمجية لديك. مثلا مكتبة التعامل مع النصوص مطلوبة، ومكتبة اخرى خاصة بلغة جافا. وإن آخر سطر لا يؤدي لطباعة اي شيئ، استخدم دالة الطباعة. حاول تجريب شيفرة برمجية من الانترنت من التوثيق الرسمي، حيث تكون مكتوبة بشكل صحيح مع تضمين المكتبات اللازمة. نفذ الخطوات و اخبرنا في حال وجود مشكلة. => ربط حزمة المطورين الخاصة بكوتلن ضمن إكليبس : تثبيت المسار لـ kotlin plugin settings in eclipse (path: Window -> preferences -> Kotlin -> Compiler -> JDK Home) و تأكد من تضمين الحزمة ضمن المشروع بالشكل الصحيح: file -> project structure -> edit sdk بالتوفيق
- 4 اجابة
-
- 1
-
مرحبا، لبناء موقع ويب علينا التفكير في جزئيتين، واجهات المستخدم و برمجة المخدم. حيث إن لغات HTML, CSS, Javascripts تعمل في المتصفح وتمثل كل مايمكن للمستخدم رؤيته والتفاعل مع الصفحات، و تمثل هذه الجزئية قسم Front-end. إن المخدم هو برنامج يعمل على حاسوب متصل بالشبكة، ويقوم بالاستجابة لطلبات المستخدمين و عمل الاستعلامات الخاصة بقواعد البيانات، من إضافة و حذف و تعديل.. إن لغة بايثون تعمل في جزئية المخدم والتي تمثل Back-end للمشروع. لبناء تطبيق بشكل احترافي باستخدام هذه التقنيات معاً، انصح بتعلم إطار عمل يستخدم لغة بايثون كلغة للمخدم ومثال مشهور على هذا هو الإطار Django. إن لغات Front-end مشتركة بجميع تقنيات الويب، فهي تعمل فقط في المتصفح، وهي مدعومة من قِبل جميع المتصفحات. أما لغات المخدم تختلف بطبيعة ما تدعمه الاستضافة، مثل برنامج تشغيل و تثبيت برمجيات تعمل على تشغيل لغة البرمجة المستخدمة. في حال أردت تطبيق تجريبي يعمل على الحاسوب الشخصي، يتم ذلك من خلال تنصيب مخدمات تسمح بتنفيذ الشيفرات البرمجية المستخدمة في المشروع و توافقها معها. ويمكن البحث عن مكتبات تفيد في التصميم مثل Bootstrap، ويمكن استخدام jQuery كمكتبة لجافاسكربت.. و مكتبات تفيد في برمجة المخدم مقدمة من إطار العمل. بالتوفيق
-
مرحبا مروان، في إطار عمل Flutter يوجد دوال خاصة للتعامل مع نمط البيانات int عند استخدام sharedPreference وهي تشبه التعامل مع string التي تستخدمها أنت .. مثال بسيط: // read final myInt = prefs.getInt('my_int_key') ?? 0; // write prefs.setInt('my_int_key', 42); استخدم الدوال getInt & setInt وهي مقدمة جاهزة ولا تحتاج للبرمجة. رابط شرح المكتبة من هنا طريقة التضمين: تضمين أحدث إصدار: dependencies: flutter: sdk: flutter shared_preferences: ^0.5.12+4 وتنفيذ التعليمة التالية: $ flutter pub get وتضمين المكتبة كما فعلت أنت بالضبط: import 'package:shared_preferences/shared_preferences.dart'; مثال للقراءة و الكتابة معا (زيادة قيمة رقمية بمقدار 1) _incrementCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); int counter = (prefs.getInt('counter') ?? 0) + 1; print('Pressed $counter times.'); await prefs.setInt('counter', counter); } بالنسبة لمثالك: import 'package:shared_preferences/shared_preferences.dart'; class MyPreferences { static const PASSWORD = "passd"; static const PHONENUMBER = "phone"; static const AGE = "AGE"; static final MyPreferences instance = MyPreferences._internal(); static SharedPreferences _sharedPreferences; String passd = ""; String phone = ""; String age = 0; MyPreferences._internal() {} factory MyPreferences() => instance; Future<SharedPreferences> get preferences async { if (_sharedPreferences != null) { return _sharedPreferences; } else { _sharedPreferences = await SharedPreferences.getInstance(); passd = _sharedPreferences.getString(PASSWORD); phone = _sharedPreferences.getString(PHONENUMBER); age = _sharedPreferences.getString(AGE); return _sharedPreferences; } } Future<bool> commit() async { await _sharedPreferences.setString(PASSWORD, passd); await _sharedPreferences.setString(PHONENUMBER, phone); await _sharedPreferences.setString(AGE, age); } Future<MyPreferences> init() async { _sharedPreferences = await preferences; return this; } } قمت بإضاقة العمر كـ AGE للمفتاح و age للمتحول الذي يحفظ القيمة. بالتوفيق
- 2 اجابة
-
- 1
-
مرحبا، كيف قمت بجلب بيانات المتحول user$ قد تكون المشكلة فيها. كما أن عبارة SQL لديك ليست بأفضل كفائة لأنك لا تعيد من الاستعلام ماتريده بالضبط، إن تعديل المدرب سمير مناسب لحالتك. أرجو منك إطلاعنا على باقي الأجزاء كما ذكرت لتحديد المشكلة، شكرا لك.
- 2 اجابة
-
- 2
-
اخي هذا الجزء الخاص بالعرض وليس هو المطلوب، نحتاج لتجريب كامل البرنامج في حالتك. كما اخبرتك المشكلة في تهيئة الجلسة القسم:
-
المهم في الشيفرة هو جزء الاتصال بقاعدة البيانات. وهو غير موجود في الجزء الذي عرضته هنا. شكرا لك
-
الجلسة غير معرّفة، اضف الكود التالي session_start(); إلى قبل ()get_header وضعها بين بادئة و خاتمة php و أخبرنا بالنتيجة
- 14 اجابة
-
- 1
-
مرحبا أحمد، بالإضافة لما قالته المدربة يٌمنى، يقوم المدربون بقبول التعليقات التي لها علاقة بالدرس والتي تتطلب شروحات و توضيحات لأفكار لم يفهمها الطالب، وتجنب أي أسئلة عن الآراء و البعيدة عن الموضوع المحدد. كما يمنع هذا م تشتيت الطلاب الآخرين عند محاولتهم قراءة التعليقات و الاستفادة من النقاشات السابقة. في حال وجود أي ملاحظات خارجية و تعليقات على الدروس يمكنك طرحها هنا في قسم الأسئلة العامة ونتناقش بما تٌريد. بالتوفيق
-
مرحبا، لا يوجد أي مشكلة في معدل قبولك للعمل على المشاريع، هو تقييم شخصي يعرضه موقع مستقل ليعرف المستقل نسبة قبول عروضه (حاول تحسين الطريقة التي تكتب فيها العرض وعمل على تحسين معرض أعمالك ليعجب صاحب العمل). ما يهم حقا هو نسبة تسليم المشاريع، أي بعد قبول عرضك على مشروع معين وعملك عليه و تسليمه لصاحب المشروع هنا يٌحسب عدد المشاريع التي قَبل صاحب المشروع استلامها (بعد تقييمه للعمل قبل استلامه أي هل هو موافق على الملفات المستلمة؟) و التي رفض ذلك أو المشاريع التي يطلب المستقل نفسه إلغاء المشروع لأسباب مختلفة حسب العمل. و للملاحظة، تأخيرك عن موعد تسليم المشروع لا يمثل مشكلة بالنسبة لموقع مستقل، طالما أن صاحب العمل يعرف ما تمر به من مسببات تأخير أو حاجته لتعديلات تتطلب وقتا أو أي سبب من ذلك. بالمختصر بالنسبة لوقت تسليم المشروع ما يحدده هو تقييم صاحب المشورع فقط ولا يتدخل الموقع أو الإدارة بذلك. بالتوفيق