اذهب إلى المحتوى

Wael Aljamal

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

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

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

  • عدد الأيام التي تصدر بها

    218

إجابات الأسئلة

  1. إجابة Wael Aljamal سؤال في ربط خدمة paypal مع تطبيق flutter كانت الإجابة المقبولة   
    مرحبا مروان،
    يمكنك تضمين WebView في التطبيق واستعمال web sdk من paypal. يوجد مكتبة تدعى flutter_braintree مهمتها عمل المناقلات المالية موجودة مع التوثيق على pub.dev يمكنك مراجعتها من الرابط flutter_braintree. Braintree هو معالج الدفع المقدم من Paypal لقبول المدفوعات الآمنة والآمنة مع ميزة Drop-in UI وتصميم واجهة المستخدم المخصص. كما يوفر ميزة Apple Pay و Google Pay لقبول المدفوعات.
    الخطوات:
    افتح حساب Braintree Sandbox
    احصل على مفتاح الترميز من حساب Braintree
    أضف تبعيات flutter_braintree في ملف pubspec.yaml الخاص بك
    إنشاء واجهة مستخدم مخصصة
    بطاقة ائتمان Paypal: تقبل ما يلي من المستخدم أ. رقم البطاقة ب. انتهاء شهر ج. سنة انتهاء الصلاحية
    احصل على NONCE من Braintree بعد الدفع الناجح واحصل على رسالة الفشل عند إلغاء دفع Paypal من قبل المستخدم.
    احفظ هذا NONCE للرجوع إليه في المستقبل في قاعدة البيانات الخاصة بك.
    الشيفرة البرمجية موجودة في التوثيق.
    يمكنك قراءة مقالة بعنوان Paypal Payment Gateway Integration in Flutter مقدمة من Medium تحوي طريقة أيضا للدفع.
    بالتوفيق
  2. إجابة Wael Aljamal سؤال في برمجة تطبيق بأستخدام Flutter، لمنصة android كانت الإجابة المقبولة   
    مرحبا،
    إن الطريقة التي تفكر بها حضرتك هي صحيحة تماماً، فإن بناء تطبيقات متعددة الأنظمة التي تدعى cross-platform صُممت لهذا الغرض، سهولة التطوير و انخفاض كلفة الصيانة و سرعة تقديم المنتج بفريق تصميم و برمجة واحد.
    سيكون اداء تطبيق Flutter ممتازاً و سريعا وبنفس أداء التطبيقات الاصلية (التي تُبنى بلغة برمجة مدعومة من نظام الاشغيل) لأن الشيفرة المصدرية فيها يتم ترجمتها بطريقة فعّالة و نفس ترميز اللغات الأصلية.
    أتمنى لك التوفيق في هذه الخطوة.
    تحياتي
  3. إجابة Wael Aljamal سؤال في كيف أدمج عناصر في لارافل كانت الإجابة المقبولة   
    مرحبا تميم،
    قم بتعريف مصفوفة تحوي القيمة المعادة،
    عرف مصفوفة لتعيد الناتج،
    قم بالمرور على المصفوفة الأولى استخرج البيانات وقم بإضافتهم للإجابة،
    ثم يمكنك إعادة اليمة التي تريدها.
    <?php $json_string = '[ {"ref":"01","hold":"1","temp":["OK"]}, {"ref":"01","hold":"2","temp":["Hot"]}, {"ref":"02","hold":"3","temp":["Hot"]} ]'; //echo $json_string; $arrays = json_decode($json_string); //echo var_dump($arrays); $result = []; // echo var_dump($result); foreach ($arrays as $obj) { if (empty($result[$obj -> ref])) { $result[$obj -> ref] = array(); } foreach($obj -> temp as $element){ //echo var_dump($element); //foreach($element as $e){ //echo /*var_dump*/($element); array_push($result[$obj -> ref], $element); //} //array_push($result[$obj -> ref],$element); } } //echo var_dump($result); //echo $result["01"]; foreach ($result["01"] as $x) { //echo var_dump($x); echo "$x\n"; } ?> بالتوفيق
  4. إجابة Wael Aljamal سؤال في اريد ان اتعلم طريقة التعامل مع الديناميك APIs كما فى الصورة .. ريأكت ناتيف او حتى ريأكت كانت الإجابة المقبولة   
    مرحبا أحمد،
    إن التعامل مع api ديناميكي يعطينا قدرة أكبر للوصول لموارد محددة من المخدم و عمل استعلامات ضمن قاعدة البيانات
    سأعطي مثال:
    /api/Organizations /api/Organizations/{orgId} نلاحظ أن الرابط الأول سيعيد مصفوفة json تحوي معلومات جميع المنظمات الموجودة لدينا في قاعدة البيانات
    أما تحديد منظمة محددة عن طريق المعرف الخاص بها ستعديد غرض json لمعلومات تلك المنظمة بالتحديد.
    يتم توجيه كل طلبية في ملف routes عند المخدم وهذا عمل مبرمج back-end
    لجلب معلومات المنظمة رقم 5 نطلب الرابط :
    /api/Organizations/5 إنها موضوع بسيط و سهل، فقط نستبدل الأقواس المجعدة بالقيمة التي نريد تحديدها بدقة.
    و مثال لآخر لإعطاء معلومات ضمن منظمة محددة يكون هكذا:
    /api/Organizations/{orgId}/group/{grpId}/member/{memberID} /api/Organizations/1234567/group/4355345/member/3256656454 سيقوم برنامج المخدم بالتقاط القيم الاختيارية الممرة مع الرابط و بناء الاستعلام الموافق و من ثم يعيد النتيجة.
    مثال لتمرير عدة وسطاء:
    app.get('/api/v1/tours/:cId/:pId/:batchNo?', (req, res)=>{ console.log("category Id: "+req.params.cId); console.log("product ID: "+req.params.pId); if (req.params.batchNo){ console.log("Batch No: "+req.params.batchNo); } }); http://127.0.0.1:3000/api/v1/tours/5/10 //or http://127.0.0.1:3000/api/v1/tours/5/10/8987 و مثال آخر:
    //With URL Params //With regex app.get('/articles/:year?/:month?/:day?', function(req, res) { var year = req.params.year; //either a value or undefined var month = req.params.month; var day = req.params.day; } //Without regex var getArticles = function(year, month, day) { ... } app.get('/articles/:year', function(req, res) { getArticles(req.params.year); } app.get('/articles/:year/:month', function(req, res) { getArticles(req.params.year, req.params.month); } app.get('/articles/:year/:month/:day', function(req, res) { getArticles(req.params.year, req.params.month, req.params.day); } Define the 3 paths you want to support and reuse the same function //With Query Params app.get('/articles', function(req, res) { var year = req.query.year; //either a value or undefined var month = req.query.month; var day = req.query.day; } //The url for this endpoint will look like this: //http://localhost/articles?year=2016&month=1&day=19 بالتوفيق
  5. إجابة Wael Aljamal سؤال في شرح عمولة بوابة الدفع الإلكترونية كانت الإجابة المقبولة   
    مرحبا مروان،
    سيأخذ الموقع عمولة لكل عملية بيع ناجحة على الشكل التالي:
    اقتطاع قيمة ثابتة تساوي 0.35$ اقتطاع نسبة مئوية قدرها 3.5$ من المبلغ المتبقي كل 1$ سيقتطع منه :
    نطرخ 0.35$ x = 1 x = x - 0.35 x = 0.65  
    نحسب النسبة و نعيد طرحها من المبلغ المتبقي لتصبح  y = x * 3.5 / 100 y = 0.65 *3.5 / 100 = 0.02275 x = x - y = 0.65 - 0.02275 = 0.62725 أرباحك من 1$ لمعاملة ناجحة يكون 0.62725 
    X هو المبلغ الذي نطبق عليه العلاقة الرياضية و y هو قيمة الخصم 
    بنفس الطريقة .. أرباحك لمعاملة بقيمة 10$ يكون 9.31225.
    تعديل: على الأغلب يوفر كل مزود خدمة دفع الكتروني توثيق بكيفية حساب نسبته وربما يأخذ النسبة من المبلغ الكلي ثم يضيف القيمة الثابتة،
    المثال السابق يوضح العمليات الحسابية بشكل عام.
    بالتوفيق
     
  6. إجابة Wael Aljamal سؤال في هل تحويل التطبيق apk صعب ام سهل ؟ كانت الإجابة المقبولة   
    مرحبا أحمد،
    في حال لا تريد رفع التطبيق إلى play store يمكنك تنفيذ الأمر التالي:
    # react-native run-android --variant=release وستجد التطبيق في المسار التالي:
    /android/app/build/outputs/apk/release ---- في حال النر على play store يجب توقيع التطبيق 
    مقالة تتكلم بالإضافة لذلك بناء تطبيق IOS من هنا
    يوجد مقالتين مفيدتين من هنا و هنا 
    بالتوفيق
  7. إجابة Wael Aljamal سؤال في وضع فيديو على شاشة حاسب ؟ كانت الإجابة المقبولة   
    مرحبا عبد الواحد،
    هذه فقط عبارة عن صورة مفرغة تم تنسيق إطار مشغل الفيديو ليكون بهذا الشكل.
    تحتاج فقط HTML - CSS
    يمكنك استخدام الشيفرة التالية:
    حيث نضع الصورة كخلفية لعنصر div وهو يعرض الفيديو في جزء منه (نبتعد عن الحواف)
    <div id="tv_container"> <video width="320" height="240"> <source src="video/video.mp4" type="video/mp4" /> </video> </div> <style> #tv_container { background: url('images/tv.png') no-repeat top left transparent; width: 400px; /* Adjust TV image width */ height: 300px; /* Adjust TV image height */ position: relative; } #tv_container video { position: absolute; top: 30px; /* Adjust top position */ left: 40px; /* Adjust left position */ } </style> أو:
    في حال تريد وضع الصورة فوق الفيديو (يجب أن تكون الصورة شفافة transparent و من نوع png)
    <div id="tv_container"> <video width="320" height="240"> <source src="video/video.mp4" type="video/mp4" /> </video> </div> <style> #tv_container { width: 400px; /* Adjust TV image width */ height: 300px; /* Adjust TV image height */ position: relative; } #tv_container:after { content: ''; display: block; background: url('images/tv.png') no-repeat top left transparent; width: 100%; height: 100%; left: 0px; top: 0px; position: absolute; z-index: 10; } #tv_container video { position: absolute; top: 30px; /* Adjust top position */ left: 40px; /* Adjust left position */ z-index: 5; } </style> بالتوفيق
  8. إجابة Wael Aljamal سؤال في سؤال بخصوص شهادة الأكاديمية، هل شهادة حسوب فعالة؟ كانت الإجابة المقبولة   
    مرحبا،
    لايمكن الحكم على أي شخص فقط عن طريق شهاداته حتى لو كانت جامعية، في مجال البرمجة تبقى الخبرة و المهارات هي العامل الأساسي في التوظيف.
    بالنسبة لشهادة الأكاديمية، لن تحصل عليها إلا باجتياز الامتحان وهذا يعطيها أفضلية عن دورات أخرى.
    طبيعة الامتحان
    بعد اتمامك للدورة، سيكون عليك التواصل معنا من خلال مركز مساعدة حسوب لتحديد موعد امتحان وسيكون على الشكل التالي:
    اجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. اجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. ان سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد. بعد الانتهاء من الدورة، يمكنك البدء بتقديم عروض العمل على منصات العمل الحر مثل مستقل للفترة الأولى لتكتسب بعض الخبرة، ثم بعد فترة تقوم بالتقديم على الشركات في حال أحببت ذلك مع تقديم جميع الأعمال التي قمت بها خلال الدورة و المشاريع الخاصة.
    بعد اجتيازك الامتحان ستتم المتابعة معك خطوة بخطوة وتوضيح جميع الطرق التي ستسلكها للحصول على عمل. حيث أحد البنود التي توفرها لك الأكاديمية عند شرائك دورة هو:
    إرشاد وتوجيه أثناء فترة بحثك عن عمل: هذا هو الهدف الأساسي لجميع دورات أكاديميّة حسوب. بعد إتمامك للدورة سيتم الإطّلاع على سيرتك الذاتية من قبل المختصّين لدينا وتقديم ارشادات مخصّصة لك لتحسينها وكذلك على ملفّك الشخصي في مواقع العمل الحر. بالتوفيق
  9. إجابة Wael Aljamal سؤال في مشكلة في دورات حسوب، دمج محتوى حسابين من الدورات لنفس الشخص في حساب واحد كانت الإجابة المقبولة   
    مرحبا حنان،
    يمكنك التواصل مع مركز الدعم و فتح تذكرة بالمشكلة مركز دعم حسوب
    بالتوفيق
  10. إجابة Wael Aljamal سؤال في مشكلة في الخصوصية لتطبيق أندرويد وطلب إذن الوصول إلى سجل الرسائل القصيرة كانت الإجابة المقبولة   
    مرحبا،
    يبدو أن المشكلة تتعلق بالخصوصية وإخبار المستخدمين أنك تقوم بتحميل جهات الاتصال..
    ربما إظهار رسالة بطلب إذن الوصول من قبل النظام لا تعمل بسبب استخدامك api 16 منخفض.
    حاول ذكر جميع المعلومات التي تستخدمها ضمن User Data policy الخاص بتطبيقك.
    يفضل في حالتك التواصل مع مطور أندرويد خبير وقد رفع عدة تطبيقات من قبل ويمكنك توظيف مستقل للقيام بهذه المهمة.
    يجب حل المشكلة بالطريقة الأمثل لأن وجود عدة شكاوي تتعلق بالخصوصية ربما تمنع نشر تطبيقك مستقبلاً بشكل نهائي.
    ويجب عمل توقيع الكترونبي للتطبيق قبل نشره
    بالتوفيق
  11. إجابة Wael Aljamal سؤال في مفهوم JSON, ما هو JSON كيفية استخدامه كانت الإجابة المقبولة   
    مرحبا،
    إن أغلب البيانات في عالم الويب يتم تناقلها بواسطة JSON:  JavaScript Object Notation 
    تمثل JSON نفس صيغة الكتابة التي تعتمد عليها JavaScript في بناء أغراضها.
    وهي هيكلية بيانات بسيطة.
    مثال:
    بناء غرض JSON للتعبير عن معلومات شخص ما.
    var person = { "name":"John", "age":31, "city":"New York" }; تكتب أغراض جيسون ضمن أقواس مجعدة { } وتحوي داخلها مجموعة من الثنائيات التي هي مفتاح و قيمة.
    المفتاح (الخاصية) مثل name - age يجب أن تكون سلسسة نصية أو رقم أو معرف خاص.
    أما القيمة يمكن أن تكون أي شيئ مثل أعداد أو سلاسل نصية أو مصفوفات أو حتى أغراض أخرى.
    نكتب القيم النصية ضمن علامتي اقتباس ( "مزدوجة" أو 'مفردة' )، أما الأرقام لا نضع حولها شيئ.
    للوصول للقيمة ضمن غرض نستخد اسم الغرض ثم نقطة ثم اسم الخاصية (المفتاح)
    مثال:
    // returns John person.name; أو عن طريق المحددات [ ] مع اسم الخاصية:
    // returns John person["name"]; و لإسناد قيمة لغرض JSON نقوم بنفس الخطوة السابقة:
    person.name = "Gilbert"; person["name"] = "Gilbert"; نمط البيانات المسمح تخزينه في القيمة من الأنواع التالية:
    a string a number (JSON object) an array a boolean null مجموعة أمثلة لتخزين قيم متنوعة في غرض JSON:
    // null { "middlename":null } // boolean { "sale":true } // array { "employees":[ "John", "Anna", "Peter" ] } // JSON { "employee":{ "name":"John", "age":30, "city":"New York" } } عندما نريد تناقل غرض JSON نقوم بتتحويله لسلسلة نصية ونضع ' (اقتباس فردي) قبله و بعده (أو لأجل تجميع السلاسل المكونة له كما في المثال التالي.
    نستخدم الدالة JSON.parse لتحويل سلسلة نصية مكتوبة مسبقا بتنسيق JSON لتعطينا متحول يحمص خواص و قيم هذا الغرض.
    كيفية ربط JSON مع صفحة HTML:
    <!DOCTYPE html> <html> <body> <h2>Create Object from JSON String</h2> <p id="demo"></p> <script> var text = '{"employees":[' + '{"firstName":"John","lastName":"Doe" },' + '{"firstName":"Anna","lastName":"Smith" },' + '{"firstName":"Peter","lastName":"Jones" }]}'; obj = JSON.parse(text); document.getElementById("demo").innerHTML = obj.employees[1].firstName + " " + obj.employees[1].lastName; </script> </body> </html> نلاحظ أن غرض JSON هنا (الأساسي) فيه خاصية واحدة تدعى employees تحوي مصفوفة من الأغراض الأخرى (الفرعية)
    نقوم بالوصول للأغراض الفرعية من خلال دليل المصفوفة index أي الرقم و من ثم نستخدم اسن الخاصية المطلوبة.
    يوجد شرح باللغة العربية جيد مقدم من أكاديمية حسوب لـ  تعلم JSON
    كما يمكنك الإطلاع على المرجع الرئيسي من موقع w3schools يوجد أمثلة تفاعلية ويمكنك تغيير الشيفرة البرمجية و مراقبة النتائج.
    بالتوفيق
  12. إجابة Wael Aljamal سؤال في ما هي صفحة الهبوط landing page و بماذا تفيد كانت الإجابة المقبولة   
    مرحبا علي،
    صفحة الهبوط أو Landing page هي الصفحة التي يتم التحويل لها بعض نقر الزائرين لإعلانات قد نشرها صاحب الموقع للترويج لمنتجاته وهي تختلف عن الصفحة الرئيسية Home Page.
    هي مهمة للتجارة الالكترونية وتتيح للمستخدم استكشاف المتجر والتعرف على المنتجات.
    يختلف تنسيقها قليلا عن تصميم الموقع, ويتم الإعتماد عليها لتشجيع الزوار بأن يقومو بعملية الشراء, أي تحويل الزائر إلى عميل مستقبلي، يتم تخصيص صفحات الهبوط لحملة أو عرض معين وتوجيه الزائرين نحوها.
    أرفقت بعض الصور، ويمكنك الملاحظة أنها بسطية و تركز على المنتج وتعرضه بطريقة مميزة.
    ويتم الاعتماد عليها عند النشر في محركات البحث بإضافة meta description and SEO title لتظهر في أولى صفحات نتائح البحث.
    باختصار هدفها للتسويق و زيادة رغبة الزائر بالشراء.
    بالتوفيق







  13. إجابة Wael Aljamal سؤال في هل يمكن ان انزل ال JDK يدويا واقوم بتسطيبه بدل هذا الكود كانت الإجابة المقبولة   
    مرحبا،
    هل يمكنك تجريب تمرير التعليمة التالية:
    --ignore-checksums بنفس السطر مع تعليمة الثبيت التي تستخدمها.
    نمرر هذه القيمة لكي لايقوم choco بفحص الحزمة و إعطاء خطأ.
    يمكنك تثبيت jdk بالتعليمة التالية:
    choco install jdk -y ربما تسريع الاتصال يتطلب تشغيل برنامج vpn لتغيير المخدم الذي يرسل البيانات.
    قرأت بعض الردود لحل المشكلة، إنها تتكرر و ستحل بعد إطلاع مطوري التقنية على المشكلة و مخاطبتهم، يوجد تحديث عالق أو ماشابه.
    شكرا لك
  14. إجابة Wael Aljamal سؤال في كيفية عمل onTap ل BottomNavigationBar في flutter كانت الإجابة المقبولة   
    مرحبا مروان،
    أعتقد أن المشكلة هي في عدم استدعاء التابع: 
    notifyListeners(); في الدالة:
    _onTap(int tabIndex) حيث يمكننا بطريقة أبسط استخدام الدالة:
    set currentIndex(int index) لتصبح:
    _onTap(int tabIndex) { switch (tabIndex) { case 0: _navigatorKey.currentState.pushReplacementNamed("home"); break; case 1: _navigatorKey.currentState.pushReplacementNamed("list"); break; case 2: _navigatorKey.currentState.pushReplacementNamed("Serach"); break; } currentIndex(tabIndex); } بالتوفيق
  15. إجابة Wael Aljamal سؤال في header location لا يعمل في php كانت الإجابة المقبولة   
    مرحبا محمود،
    نعم يمكننا عمل إعادة التوجيه عن طريق جافاسكربت كما فعلت في الشيفرة البرمجية الثانية.
    التي تضمنت:
    <script> location.href = '404'; </script> or window.location.href='404'; ربما لن تعمل في حال تم إيقاف جافاسكربت في المتصفح (يحدث إعادة التوجيه هنا ف المتصفح وليس المخدم)
    قم بتجريب التالي وأخبرنا بالنتائج:
    <?php if(!isset($_GET['name'])){ header("location: 404"); exit(); // or die(); or exit } ?> <div> Hello: <?php echo $_GET['name'];?> </div> نستخدم exit - die لنتأكد من توقف عمل الشيفرة البرمجية قبل إرسالها لعناصر HTML في حال تأخر تنفيذ إعادة التوجيه.
    يمكنك تحديد باراميترات تابع إعادة التوجيه بالقيم التالية:
    301 في حال كنت تريد إخبار أن الصفحة الحالية تم نقلها لمكان آخر بشكل دائم
    302 تم نقل الصفحة بشكل مؤقت..
    header("location: http://example.com", true, 301 ); exit; وعليك التأكد من أن ترميز الصفحة يتم باستخدام UTF-8 في ملف php.ini 
    default_charset = "utf-8"; بالتوفيق
  16. إجابة Wael Aljamal سؤال في هل يمكنني برمجة تطبيق للهواتف بلغات الويب كانت الإجابة المقبولة   
    مرحبا علي،
    نعم تستطيع استعمال قواعد البيانات mySQL و لغة البرمجة PHP لبرمجة جزء المخدم من مشروعك Back End
    فإنها شيئ منفصل عن برمجة التطبيق.
    بشكل عام يمكن استخدام أي طريقة لبرمجة السيرفر و أي طريقة لبرمجة (موقع ويب - برنامج سطح مكتب - تطبيق هاتف) باختلاف أنظمة التشغيل.
    لأنها كلها تعتمد على تبادل البيانات بين Front End  وBack End وتستخدم بروتوكول HTTP protocol لتبادل البيانات عبر الشبكة.
    ويتم طلب البيانات باستدعاء روابط URL محددة (يفضل بناء واجهة تخاطب برمجية API)
    يتم توفير البيانات بصيغة JSON لتكون سريعة فك الترميز والتعامل معها.
    تقدم أكاديمية حسوب دورة كوردوفا cordova و آيونيك Ionic  (دورة تطوير تطبيقات الجوال باستخدام تقنيات الويب) هنا
    لإنشاء تطبيقات الويب الهجينة التي تعمل على نظامي أندرويد و IOS بالإضافة كونها موقع ويب.
    ويمكنك تعلم React native التي تعمل بلغة برمجة جافا سكربت (دورة تطوير التطبيقات باستخدام JavaScript) هنا
    كما يوجد تقنيات أخرى مثل  Xamarin.
    بما أنك مشترك في دورة من الأكاديمية، يمكنك الإطلاع على المسارات الأولى من الدورات الأخرى وأخذ فكرة عنهم ثم تحديد ماذا تريد أن تتعلم.
    بالتوفيق
  17. إجابة Wael Aljamal سؤال في معالجة إدخال متكرر من المستخدم واستخدام الحلقات في كوتلن كانت الإجابة المقبولة   
    مرحبا يحيى،
    فكرة الحل هي فحص قيمة المتحول 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
    بالتوفيق
  18. إجابة Wael Aljamal سؤال في كيفية حماية تطبيقات flutter كانت الإجابة المقبولة   
    مرحبا مروان،
    إن عملية حماية اي تطبيق مهما كانت المنصة المبرمج فيها وبنسبة 100% هو أمر مستحيل.
    دائما يوجد طريقة للاختراق وإعادة تشكيل الشيفرة البرمجية الأصلية بعملية عكس الترجمة decompile.
    هل يمكن جعل عملية الهندسة العكسية غير مفيدة إلى حد ما؟ نعم، عن طريق جعل الشيفرة البرمجية أصعب للفهم من قِبل المخترق.
    تتم هذه العملية عن طريق تغيير اسماء الصفوف و المتحولات و الإجرائيات في الشيفرة البرمجية و إعطائها أسماءً طويلة و غير مفهومة.
    تدعى هذه العملية ب Obfuscating Dart code مثل إزالة الوضوح عن الشيفرة البرمجية، فبعد عملية الهندسة العكسية، ينتج برنامج غير واضح المعالم وصعب الفهم و التعقب.
    توفر Flutter طريقة خاصة لعمل هذا الأمر بشكل بسيط يمكنك تعلم الطريقة بتنفيذ تعليمة محددة أثناء بناء التطبيق من هنا: Obfuscating Dart code.
    هي طريقة سهلة وتعتبر تمرير بارامترات لعملية بناء التطبيق وليس أكثر بالنسبة للمستخدمين.
    بالنسبة لمنع حصول الهندسة العكسية، هو أمر غير ممكن.
    بالتوفيق
  19. إجابة Wael Aljamal سؤال في تحليل بيانات و عمل تقرير و إرسال إيميل في بايثون كانت الإجابة المقبولة   
    مرحبا،
    سأكتب التعليقات المساعدة ضمن الشيفرة البرمجية:
    #!/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) بالتوفيق
  20. إجابة Wael Aljamal سؤال في كيفية عرض تنبيه في حالة عدم وجود بيانات flutter كانت الإجابة المقبولة   
    مرحبا مروان،
    في الجزء الخاص قبل عرض القائمة ListView نختبر شرط طول القائمة flowers، فإذا كان اكبر من صفر نعرض عناصر القائمة نفسها، وفي حال غير ذلك نعرض عنصر آخر يحوي على نص الرسالة التي تريدها (او عنصر قائمة وحيد فيه الرسالة).
    اي استخدم عبارة if else عادية.
    إذا هو اختبار لوجود بيانات من عدمه، نضعه شرط في سياق بناء الواجهة widget و نستعرض ما هو مناسب للتطبيق.
    بالتوفيق
  21. إجابة Wael Aljamal سؤال في مشكلة في محاكي اندرويد VT-x، android emulator كانت الإجابة المقبولة   
    مرحبا أحمد،
    يتطلب تشغيل ال Emulator لديك تفعيل خاصية VT-x والتي يمكن تفعيلها بعد الدخول لإعدادات BIOS.
    عملية الدخول لإعدادات BIOS تختلف من جهاز حاسوب لآخر، عليك البحث في الانترنت عن هذه الجزئية.
    وكيفية تفعيل هذا الخيار، ممكن حضور فيديو شرح من على يوتيوب مثلا.
    إن هذه الخاصية مسؤولة عن تسريع النظام الافتراضي الذي نرغب بتشغيله جنبا إلى جنب مع النظام الأساسي.
    مثلا Emulator اندرويد يشغل نظام اندرويد كبيئة خاصة لتطبيقات أندرويد التي نشغلها عليه بإنشاء virtual machine.
    وهذا يحدث نفسه لكل عملية تشغيل نظام افتراضي على آخر و تسريع عميات ال Hardware ضروري لتعمل بسلاسة، وهذه ويدعمها عدد من المعالجات.
    مثلا لتشغيل نظام لينوكس او ويندوز آخر على حاسوبنا نستخدم أحيانا برامج البيئة الافتراضية مثل virtual box او VMware Workstation والتي عملها يكون بتحويل التعليمات التنفيذية من النظام الذي نشغله عليها إلى تعليمات نظام التشغيل الذي يشغل الحاسوب.
    حيث نعلم ان كل نظام حاسوبي له مجموعة تعليمات مختلفة يقوم المعالج بتنفيذها لكي يعمل الحاسوب.
    بالتوفيق
  22. إجابة Wael Aljamal سؤال في كيفية ايقاف عمل CircularProgressIndicator في flutter كانت الإجابة المقبولة   
    مرحبا،
    إن طريقة إنهاء عمل ProgressIndicator (متابع التقدم) هو عبارة عن إزالته من العرض بشكل كامل.
    يتم ذلك من خلال تحديث الحالة الذي يقوم بإعادة رسم عناصر الواجهة (وسيمون التحديث مع عدم تضمين هذا العنصر)
    فسيتم إخفائه.
    الحل:
    نعرف متحول خاص بعرض ProgressIndicator (متابع التقدم) مثلا:
    متحول يدل على التحميل:
    bool isLoading = false; وتابعين للتحكم به والربط مع العرض:
    العرض و الإخفاء تتم بتعديل الحالة..
    void show() { setState(() => isLoading = true); } تغيير الحالة void dismiss() { setState(() => isLoading = false); } وعند رسم العناصر ضمن سياق الشيفرة البرمجية الطبيعية نفحص قيمة المتحول وعندها إما نرسم ProgressIndicator أو لا.
    child: isLoading? Center( child: CircularProgressIndicator(), ), : null // عنصر فارغ عند أي تغيير في الحالة state سيتم إعادة رسم الواجهة وفحص المتحول isLoading وعليه سيتقرر رسم متابع التقدم أو لا.
    بالتوفيق
  23. إجابة Wael Aljamal سؤال في كيفية استخدام shared Preference في flutter مع نمط البيانات int كانت الإجابة المقبولة   
    مرحبا مروان،
    في إطار عمل 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 للمتحول الذي يحفظ القيمة.
    بالتوفيق
  24. إجابة Wael Aljamal سؤال في مساعدة حل مشكلة الخطأ كانت الإجابة المقبولة   
    الجلسة غير معرّفة،
    اضف الكود التالي 
    session_start();
    إلى قبل ()get_header
    وضعها بين بادئة و خاتمة php 
    و أخبرنا بالنتيجة
  25. إجابة Wael Aljamal سؤال في مشكلة في PyCharm، يعرض إخطارات خاطئة كانت الإجابة المقبولة   
    مرحبا زينب،
    هل حاولتي تغيير نسخة برنامج PyCharm؟ تأكدي من وجود تحديثات.
    حبذا لو ترسلي صور للإخطارات لربما نصل لحل أفضل للمشكلة.
    بطبيعة الحال visual studio code هو محرر نصوص ممتاز ويقبل تثبيت إضافات مختلفة من قسم Extentions لإعطائه ميزات أكثر للتعامل مع مختلف لغات البرمجة و أطر العمل.. في حال رغبتك باستخدامه تأكدي من تثبيت الإضافات المناسبة بعد البحث في القسم Extenstion وتثبيت ما يلزم.
    يمكنا إيقاف التحذيرات في PyCharm بالخطوات التالية الموجودة علي موقعهم الرسمي من هنا
    اختصار الخطوات:
    ندخل إلى Settings/Preferences و نختار Editor | Inspections. تحديد inspection الذي نريد تعطيله ونُلغي التحديد من checkbox. حفظ التغييرات ليتم تطبيقها أحيانا ومع تحديث البرامج تظهر أخطاء، التي يتم حلها في تحديث آخر.
    تأكدي في حال وجود إضافات قيد التشغيل لربما سببت المشكلة.
    بالتوفيق
×
×
  • أضف...