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

Sam Ahw

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

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

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

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

    16

كل منشورات العضو Sam Ahw

  1. يمكن استقبال الدفع الالكتروني على مواقع الويب والتطبيقات دون وسيط أو payment gateway بالتعامل مباشرةً مع إحدى البنوك التي تقدّم حلول الدفع الالكتروني، ومن هذه الحلول استخدام API أو Hosted Payment أو حسب ما يقدّمه البنك وعندها لن تحتاج لفتح webview مثلاً في حال كنت تستخدم API للدفع. بالنسبة للمتاجر لن تواجه مشاكل فكثير من التطبيقات تتعامل بالدفع بشكل ضمني من خلال API أو غيرها من الحلول، ولكن يجب عليك تطبيق الحماية اللازمة للتطبيق عندها لأنها ستكون من طرف التطبيق ويجب تأمين طريقة الدفع ومنعه من الاختراق من طرف المطور، ولكن في جميع الأحوال مصدر استقبال الدفعات الالكترونية سيفرض عليك آليات حماية ليحمي نفسه أيضاً، لذذلك ستبقى هناك معايير حماية من البنك نفسه لاستقبال الدفعات يجب عليك تطبيقها لإكمال العمليات بنجاح وإلا لن تستطيع إكمال العملية. تختلف هذه المعايير من API لأخرى ومن جهة لأخرى ولكن جميع الخطوات تكون موضحة في دليل الاستخدام أو التوثيق.
  2. الصف: هو مخطط أو نموذج أولي يقوم المبرمج بكتابته لإتاحة إمكانية إنشاء أغراض (Objects) منه لاحقاً. فهو يجمع كافة الأغراض التي لها نفس النوع والتي تتشارك بخصائص ودوال. الواجهة Interface: مشابهة للصف من حيث تجميع الدوال والخصائص بفارق بسيط أن الدوال تكون مجرّدة أي بدون محتواها (body) بشكل افتراضي. وبالتالي يعتمد المطوّرين على المبدأ التالي عند الحاجة للتمييز بين عمل الصف والواجهة، وهو أن الواجهة تعبّر عن ماذا يمكن للصف أن يعمل (أي ماهي الدوال التي سيحتوي عليها الصف) دون الحاجة لذكر كيف يجب أن يقوم بذلك. أما الصف، فيتم ذكر تفاصيل تنفيذ هذه الدوال وكافة الشيفرات البرمجية التي تعبّر عن طرق تنفيذ أي خاصية. بعض الفروقات الأخرى: يمكن انشاء الصف بشكل صريح (instantiated) وكذلك يمكن إنشاء أغراض من هذا الصف، أما الواجهة لا تسمح إنشاء أغراض منها. الصفوف لا تسمح بالوراثة المتعددة، أما الواجهات تسمح بذلك يسمح للصف بالوراثة من صف آخر، أما الواجهة لا يمكن أن ترث من صف آخر. الصف يمكن أن يحوي باني أو (constructor) أما الواجهة لا تحوي باني لأنه لا يمكن إنشاء أغراض منها. الصف يتيح عدة مستويات لتعريف الخصائص والدوال ضمنه (public, private, protected, default) أما الواجهة فجميع الخصائص والدوال ضمنها هي من نوع public المتغيرات ضمن الصفوف يمكن أن تأخذ أحد الأنواع (static, final) وممكن ألا تأخذ أي نوع من هذين النوعين. أما في الواجهة فجميع المتغيرات هي من نوع static أو final حصراً.
  3. بنفس الطريقة التي اتبعتها في كتابة الأخطاء للحقول الأولى تقوم بإضافة متغيّرين لرسائل الخطأ المطلوبة عند استقبال طلب Post: $languagesErr = $commentErr = ""; وبعدها يجب إضافة آلية التحقق من المدخلات: if (empty($_POST["comment"])) { $genderErr = "Comment is required"; } else { $comment = test_input($_POST["comment"]); } وبنفس الطريقة لحقل languages، مع وجود خطأ بسيط لديك هو أن الحقول checkbox يجب أن تحوي الخاصية value ليتم الاحتفاظ بقيمة الخيار الفعلي: languages: <input type="checkbox" name="Arabic Language">Arabic Language <input type="checkbox" name="FMaths"> Maths <input type="checkbox" name="English Language">English Language <input type="checkbox" name="French"> French <span class="error"> <?php echo $languagesErr;?></span> <br><br> يجب تعديلها لتصبح: <input type="checkbox" id="arabic" name="arabic" value="Arabic Language"> <label for="arabic">Arabic Language</label><br> وأعتقد أن الشيفرة البرمجية التي أرفقتها ناقصة ففيها بعض الأخطاء والتوابع الغير موجودة ضمن الصفحة ولكن هذه هي فكرة الحل بشكل عام.
  4. أولاً إن إظهار وإخفاء جداول أو عناصر ضمن محتوى صفحة يرتبط بالجافاسكريبت وليس بطرف الخادم أو PHP. يمكنك استعمال إحدى الإضافات مثل TablePress أوغيرها أو يمكنك إضافة صفوف css معيّنة أو Id إلى الجداول من خلال لوحة تحكّم ووردبريس وإضافة كود جافاسكريبت بسيط لإظهار وإخفاء الجداول بشكل مشابه للتالي: functionshow toggleTable() { var x = document.getElementById("table1"); if (x.style.display === "none") { x.style.display = "block"; } else { x.style.display = "none"; } } كما يمكنك الاستفادة من توابع add و remove لتبسيط الشيفرة البرمجية: function toggleTable() { var table = document.getElementById("table1"); if(table.classList.contains("showTable")) { table.classList.remove("showTable"); } else { table.classList.add("showTable"); } }
  5. يمكنك التعمّق في تحسين محركات البحث من خلال التعرّف أكثر على طرق عملها، بما أنه لديك خبرة متقدمة في بعض المعلومات حاول زيادة هذه المعلومات من خلال تجريب بعض الأمثلة الحية على مواقع الويب الموجودة وإن أمكن تطبيق المهارات التي تتعلمها على مواقع تستطيع الوصول إلى شيفرتها البرمجية. فمن أهم مهارات تحسين محركات البحث هو التعمّق في آلية عملها وفهم كيف تعمل خوارزمياتها من Crawler و Index و Rank بعد ذلك يمكنك الانتقال إلى بعض المهارات البرمجية الخاصة بتحسين محركات البحث والبحث عن ماهي عناصر HTML التي تساعد على تحسين محركات البحث ضمن صفحات الويب وماهي صيغ الصور والتنسيقات المطلوبة والأخرى التي يجب تجنبها من خلال البحث عن HTML SEO Tags. وأيضاً الغوص في المحتوى لأنه الأهم في هذه العملية وزيادة ماتعرفه من خبرات عن الكلمات المفتاحية وكتابة المحتوى والبحث عن معنى مصطلع Content audit وآليات تطبيقه. كما يمكنك زيادة خبرتك بالتعامل مع أدوات تحسين محركات البحث ومنها أدوات Google والبحث على الانترنت عن شروحات لهذه الأدوات وكيفية استخدامها.
  6. بعض النصائح التي قد تساعدك على زيادة المبيعات على حسابك: كتابة كلمات مفتاحية قوية ضمن اسم ووصف المنتجات لديك، ولإيجاد هذه الكلمات يجب عليك البحث بدقة ضمن محركات البحث والحسابات المنافسة وملاحظة ماهي الكلمات التي يتم استخدامها بكثرة الاهتمام بوصف المنتج بشكل كبير، بحيث يكون سهل القراءة وشامل يحوي كافة التفاصيل عن المنتج والجودة والمعايير،..إلخ. وضع صور عالية الدقة وواضحة لمختلف وضعيات المنتجات، وإن أمكن إرفاق صور واقعية عن المنتجات التي تقوم ببيعها جذب الزبائن لتقييم منتجك عند أي عملية شراء فكلما زاد التقييم زادت فرصك ببيع المنتج يمكنك أيضاً الاشتراك ببرامج أمازون المدفوعة PPC للإعلان عن منتجاتك التسويق لمنتجاتك مع تطبيق آليات للخصم في عمليات التسويق أما بالنسبة لاختيار النيتش المستهدف فذلك ينطلق من منتجك بشكل خاص، حاول كتابة بعض الأسئلة عن منتجك وقم بالإجابة عليها بنفسك وذلك سيساعدك في تحديدها، مثل: لمن المنتج؟ ماهي الفئات العمرية التي ستقوم بشرائه؟ الدول أو اللغات المستهدفة،...إلخ. كما تقدّم لك أمازون شروح مفصّلة عن طرق زيادة نسبة المبيعات وتصدّر البحث من خلال الموقع الرسمي والدليل الموجود.
  7. يمكنك التواصل مع مركز مساعدة أكاديمية حسوب بالضغط هنا وسيقومون بمساعدتك والإجابة على استفساراتك بشكل أفضل
  8. المنصة متعددة البائعين أو مايعرف بـ multi-vendor، هي منصة واحدة يمكن لأي بائع إنشاء حساب فيها وبيع منتجاته من خلالها. لذلك ليس بالضرورة أن تحوي خاصية إنشاء اسم نطاق فرعي فهذه خاصية إضافية ليست مرتبطة بمعنى multi-vendor. وسيتطلب إنجازها بعض الإعدادات المتعلّقة بخادم الويب نفسه والاستضافة التي ستحوي منصتك مع ربطها بالشيفرات البرمجية التي ستكون مسؤولة عن إتمام هذه العملية. أما بالنسبة لأسئلتك حول المنصة aimeos فلا أعتقد أنها مجانية، بمجرّد الدخول على الموقع المرفق ومن صفحة pricing ستجد الأسعار والباقات المتاحة. وحول إمكانية تثبيتها على استضافتك، لا يمكننا تحديد ذلك دون معرفة ماهي استضافتك وكافة التفاصيل عنها، كما أنه لا يوجد الكثير من المعلومات على موقع الشركة لأنه يتطلب التواصل معهم للحصول على المزيد من التفاصيل. وعند زيارة الرابط الثاني للشيفرة المصدرية على Github تم ذكر في التوثيق أنها تدعم كافة الخصائص التي تحدثت عنها في تعليقك مع إتاحة روابط demo للتجربة. لذلك أقترح عليك ترجمة التوثيقات التي لا تستطيع قرائتها والمحاولة ببدء تضمينها في مشروعك.
  9. هل يمكنك إرفاق الإعدادات التي وضعتها في النظام؟ في المسار /etc/ssmtp/ssmtp.conf يجب أن تكون الإعدادات بشكل مشابه للتالي: root=test@gmail.com mailhub=smtp.gmail.com:587 AuthUser=test@gmail.com AuthPass=***** UseTLS=YES UseSTARTTLS=YES rewriteDomain=gmail.com hostname=localhost FromLineOverride=YES TLS_CA_File=/etc/ssl/certs/ca-certificates.crt مع استبدال البيانات التجريبية ببيانات البريد الالكتروني. وبعد ذلك تأكد من إضافة revaliases في المسار /etc/ssmtp/revaliases root:example@gmail.com:smtp.gmail.com:587 مع استبدال example بعنوان البريد الالكتروني كما يجب عليك تفعيل السماح للتطبيقات الأقل حماية (Less Secure Apps) من داخل إعدادات Gmail.
  10. لا ينصح بتخزين الصور كما هي ضمن قواعد البيانات لعدة أسباب ومنها الحجم، كما أن Sqlite هي قاعدة بيانات خفيفة (من اسمها) وبالتالي لا ينصح أيضاً باستخدامها لتخزين البيانات الثقيلة أو للعمليات الكبيرة. فحتى لو قمت باتباع آلية معينة لضغط الصورة قبل حفظها، من الممكن تجاوز الحد المسموح في Cursor Window وهو عادةً 4MB فقط. لذلك الحل الأفضل هو بتخزين الصورة بشكل محلي أو على خادم ويب وحفظ مسار الصورة فقط ضمن قاعدة البيانات، وبالتالي بدلاً من تخزين صورة بحجم كبير سيتم تخزين سلسلة نصية تعبّر عن مسار وجود الصورة لاستعادتها ضمن التطبيق وإظهارها. public void updateImage(long imageId, Bitmap picture) { //يتم تخزين الصورة بشكل محلي مع رقم معرّف فريد لكل صورة لتجنب مشكلة أكثر من ملف بنفس الاسم String picturePath = ""; File internalStorage = mContext.getDir("MyPictures", Context.MODE_PRIVATE); File reportFilePath = new File(internalStorage, reportId + ".png"); String picturePath = reportFilePath.toString(); FileOutputStream fos = null; try { fos = new FileOutputStream(reportFilePath); picture.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); } catch (Exception ex) { Log.i("Problem updating picture", ex); picturePath = ""; } //تعديل مسار حفظ الصورة في قاعدة البيانات من خلال الرقم المعرّف الفريد SQLiteDatabase db = getWritableDatabase(); ContentValues newPictureValue = new ContentValues(); newPictureValue.put(Images.ImageEntry.COLUMN_PICTURE_TITLE, picturePath); db.update(Images.TABLE_NAME, newPictureValue, Images.ImageEntry._ID + "=?", new String[]{String.valueOf(imageId)}); } }
  11. Gradle هو مجموعة أدوات متطورة يستخدمها Android Studio لأتمتة وإدارة عمليات بناء مشروعك، كما يسمح لك بتحديد مكونات وإضافات خاصة ومرنة يمكنك إضافتها إلى المشروع من خلال أسطر برمجية قليلة دون تعقيد. في السابق أثناء استخدام Eclipse وقبل ظهور android studio، كان من الصعب إضافة وتضمين الحزم الخارجية أثناء برمجة تطبيقات جافا أو اندرويد، فكان يجب عليك تحميل هذه الحزم بصيغ jar بشكل منفصل وتضمين كل منها على حدى، مع صعوبة اكتشاف مشاكل الاعتماديات التي قد تسببها وهنا ظهر Gradle لحل هذه المشكلات وتسهيل عملية بناء التطبيق على المبرمج، حيث يتيح لكل مكوّن إضافي تحديد مجموعته الخاصة من التعليمات البرمجية والموارد اللازمة لعمله مع إعادة استخدام الأجزاء المشتركة لجميع إصدارات التطبيق، وبالتالي يمكن اكتشاف أي خطأ أو سوء استخدام لنسخ معيّنة من الاعتماديات أثناء بناء التطبيق وتحديثها بشكل مباشر. وهو متاح ضمن مستوى التطبيق (ضمن المجلّد الجذر لملفات مشروعك) والآخر ضمن مستوى المشروع أو مايعرف بـ (module level): ضمن مستوى التطبيق (app/build.gradle): حيث يتم تضمينه ضمن كل وحدة أو module ضمن تطبيقك، يتضمن اسم الحزمة الخاصة بالتطبيق والمعلومات الأساسية عنه مثل المعرّف الأساسي ورقم الإصدار ورمز الإصدار نسخ التشغيل المستهدفة SDK version وغيرها. وعندما يتم إضافة أي حزم خارجية (plugins) يجب ذكرها ضمن هذا الملف لتضمينها في المشروع باعتبارها تبعيات للتطبيق نفسه (مثل firebase وغيرها). ضمن مستوى المشروع (android/build.gradle): وهو ملف بناء على مستوى المشروع ككل، يحدد تكوينات المشروع بشكل عام ليتم تطبيقها واستخدامها على جميع الوحدات ضمن المشروع وعادةً ما نجد بداخله الاعتماديات الأساسية لـ google أو Kotlin والتي سيتم استخدامها لاحقاً ضمن الوحدات modules. يمكنك إيجاد المزيد من التفاصيل في التوثيق الرسمي لموقع gradle ضمن قسم Gradle User Manual، وضمن توثيق بناء التطبيقات من غوغل كما يمكنك الاطلاع على المقال التالي:
  12. يوجد عدة طرق لاستخدام مكتبة React JS: إضافة React إلى تطبيق ويب موجود أو باستخدام CDN: يتم تضمين الروابط التالية ضمن ترويسة الصفحة الأساسية لمشروعك قبل إغلاق الوسم Body ... <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script> <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script> <script src="test.js"></script> //نقوم بتضمين ملف إضافي لكتابة الشيفرة البرمجية الخاصة ... </body> //ضمن ملف test.js //يمكنك تجربة عمل المكتبة بالمثال التالي const domContainer = document.querySelector('#like_button_container'); const root = ReactDOM.createRoot(domContainer); root.render(e(LikeButton)); من خلال مدير الحزم NPM: npx create-react-app my-app أما بالنسبة لاستخدامه ضمن الهاتف الجوال، فلا أعتقد أنها طريقة مجدية لبناء وتطوير تطبيقات الويب باستخدام الهاتف، خصوصاً عند استخدام مكتبات وأطر عمل أخرى، فذلك يحتاج لموارد أكبر من التي يملكها الهاتف المحمول لمعالجة وتفسير الشيفرات البرمجية ومتابعة الأخطاء، دون التطرق لصعوبة كتابة الشيفرة البرمجية والتنقل بين البيئة التطويرية كما أنه في معظم الأحيان لن تتمكن من تشغيل خادم محلي بنفس الطريقة على الهاتف ..إلخ. يمكنك إيجاد المزيد من التفاصيل ضمن الإجابات التالية: أما الدورات والدروس التعليمية فتختلف للطريقة التي ترغب بالتعلّم بها، إما بالبحث عن فيديوهات تعليمية أو قراءة التوثيق الرسمي للمكتبة واتباع الخطوات وتطبيقها في مشاريع علمية. يمكنك الاطلاع على دليل تعلّم رياكت التالي:
  13. إن العملية طويلة بعض الشيء ولكن الخطوات ستكون كالتالي: إنشاء Elastic Beanstalk web application تعديل السماحيات Permissions إنشاء قاعدة البيانات أو ربطها. ربط مستودع git لمشروعك مع الحافظة إنشاء code pipeline لمشروعك الخطوة الأولى: لإنشاء Elastic Beanstalk web application في نافذة الإدارة (management console) ستجد زر إنشاء تطبيق. بعد ذلك، يجب عليك تعبئة بعض الحقول عن التطبيق باختيار Node.JS ضمن حقل المنصة والفرع branch حسب استضافتك، مثال: Node JS running on 64bit Amazon Linux وبعدها قم باختيار نموذج أولي للتطبيق أو sample application وقم بإنشاء التطبيق. بعدها سيأخذ بعض الوقت وستظهر واجهة لك فيها حالة المشروع وزر لنشر التطبيق كاملاً. الخطوة الثانية: تعديل السماحيات يتم من خلال IAM (Identity and Access Management) الخطوة الثالثة: بعد إنشاء قاعدة البيانات وربطها بمشروعك، يجب عليك تعديل بعض القيم الموجودة في ملف options.config الخاص بالربط، مثال: option_settings: aws:elasticbeanstalk:customoption: NewSignupEmail: ضع بريدك الالكتروني هنا aws:elasticbeanstalk:application:environment: THEME: “flatly” AWS_REGION: ‘`{“Ref” : “AWS::Region”}`’ STARTUP_SIGNUP_TABLE: ضع اسم قاعدة البيانات هنا NEW_SIGNUP_TOPIC: ‘`{“Ref” : “NewSignupTopic”}`’ aws:elasticbeanstalk:container:nodejs: ProxyServer: nginx aws:elasticbeanstalk:container:nodejs:staticfiles: /static: /static aws:autoscaling:asg: Cooldown: “120” aws:autoscaling:trigger: Unit: “Percent” Period: “1” BreachDuration: “2” UpperThreshold: “75” LowerThreshold: “30” MeasureName: “CPUUtilization” ويمكنك إيجاد بعض الأمثلة عن الخصائص والإعدادات من مستودع awslab مفتوح المصدر على Github. الخطوة الخامسة: يتم إنشاء code pipeline من النافذة management console ضمن قسم Development Tools، سيعرض عليك مجموعة من الحقول لتعبئتها مثل اسم المشروع وبعض التفاصيل ومصدر المشروع، هنا يجب عليك اختيار github كمصدر للمشروع وتسجيل الدخول من حسابك ليتم الربط بالشكل الصحيح وتبادل البيانات مع الخادم.
  14. عنوان الدورة عنوان عام، ويمكن لأي جهة تقديم دورات بهذا الاسم، لذلك لا يمكننا إعطاء إجابة عن مدى قوة أو وزن الشهادة من خلال العنوان فقط، يجب عليك البحث عن مصدر الدورة مثل اسم الشركة أو الجهة الأكاديمية التي تقدّم هذه الدورات لمعرفة ذلك. أما بالنسبة لكيفية الحصول على شهادة من دورة ما، فحتماً يجب عليك التسجيل على المنصة نفسها التي تقدّم المحتوى التعليمي واجتياز بعض الاختبارات للحصول على الشهادة التي توثّق أنك أتتمت تعلم مسار محدد أو مهارات معيّنة اكتسبتها من خلال المحتوى التعليمي المقدّم من قبلهم.
  15. الوظيفة نفسها تقريباً في اقتطاع أجزاء من سلسلة نصية، أما الاختلاف بين: substring: المتغيرات التي يقبلها هي الموقع الأول والموقع الأخير لمحارف السلسلة الجزئية. const str = 'Congratulations'; console.log(str.substring(1, 3)); // "on" //يمكننا أيضاً عدم استخدام المتغير الثاني لأخذ كامل السلسلة المتبقي console.log(str.substring(2)); // "ngratulations" substr: المتغير الأول يكون الموقع الذي سيتم البدء منه باعتبار السلسلة الجزئية، أما المتغير الثاني يكون عدد المحارف المراد استعادتها. const str = 'Congratulations'; console.log(text.substr(2,3)) // => "ngr" تأخذ فقط 3 محارف بدأ من الموقع 2 أما Slice فعملها مشابه تقريباً لعمل substring، تختلف فقط في تعاملها مع المتغيرات ذات القيمة السالبة (مثل -1): let text = 'Mozilla' console.log(text.substring(5, 2)) // => "zil" console.log(text.slice(5, 2)) // => "" لمزيد من المعلومات والأمثلة يمكنك الاطلاع على الأمثلة الموجودة في المقال التالي:
  16. إن OAUTH2 هو بروتوكول أو معيار، لذلك من الممكن أن يحوي ضمنه طريقة التوثيق باستخدام JWT. أما JWT فهو فقط رمز token، يتم استخدامه بين طرفي خادم الويب والعميل للتحقق والتوثيق وبالتالي ليس آلية توثيق متكاملة بحد ذاتها. بالنسبة للاستخدام، فذلك يعود لطبيعة المشروع، في حال كان مشروعك بسيط مكوّن من تطبيق زبون client application واحد، فلا حاجة لاستخدام Oauth. أما في حال كان لديك مجموعة من التطبيقات التي ستتعامل مع خادم الويب وبأنواع مختلفة: تطبيقات ويب، تطبيقات هاتف جوال، وغيرها.. عندها سيكون من الأفضل استخدام Oauth بدلاً من تطبيق العمليات وإدارتها بنفسك. في النهاية، لا يوجد قانون محدّد لذلك، قد تختلف المتطلبات وأساسيات الحماية المطلوب توافرها في مشروعك.
  17. عملية المقارنة ( | ) هي عملية ثناية تتم على مستوى البت وتعرف بـ Bitwise Operation: بحيث يتم فيها المقارنة على مستوى البتات المكونة لكل من الطرفين بدلاً من القيم ككل: print_r(1 | 2) // 3 ناتج الطباعة أما عملية المقارنة ( || ) فهي عملية منطقية تتم على مستوى نمط البيانات من نوع Boolean والتي تستخدم غالباً ضمن الجمل الشرطية وفي معظم الشيفرات البرمجية: print_r(1 || 2) // 1 ناتج الطباعة والفرق الأهم بين كل منهما هو أنه في عملية المقارنة المنطقية Boolean أو ( || ) يتم فيها التحقق من الشروط بدءً من اليسار، وفي حال تحقق شرط ما، يتم إهمال بقية الشروط. عكس الطريقة السابقة ( | ) حيث يتم فيها تنفيذ المقارنة الثنائية على جميع القيم (الشروط) الموجودة. if(condition1 || condition2 || condition3) //في حال تحقق الشرط الأول، سيتم التوقف عن تقييم بقية الشروط if(condition1 | condition2 | condition3) //سيتم تقييم جميع الشروط بغض النظر عن تحقق أي شرط منهم وهذا الفرق ينطبق أيضاً على عمليات & و && بشكل مشابه، ولكن بشكل عام نادراً مانجد استخدام لعمليات المقارنة الأحادية (أي | و &) وسبب ذلك بسيط: if(person != null && person.age < 18) في هذا المثال سيتم أولاً التحقق من الشرط الأول (وهو أن القيمة person لاتساوي null)، وفي حال تحقق الشرط لن يتم إكمال التحقق من الشروط الأخرى وسيتم الخروج من الجملة الشرطية فوراً. أما لو استخدمنا & بدلاً من && من الممكن أن نحصل على خطأ من نوع NullReferenceException وذلك لأننا نتحقق من خاصية age لمتغيّر غير موجود null. لذلك يتم في أغلب الأحيان استعمال عمليات المقارنة المزدوجة && و || ما لم يكن هناك حاجة ضرورية في البرنامج لاستخدام العمليات الأحادية أو عند الحاجة للتعامل على مستوى البت كما رأينا في Bitwise Operation أو ضمن لغات البرمجة منخفضة المستوى والقريبة من لغة الآلة.
  18. بالنسبة للشهادات المعتمدة من جهات معيّنة مثل Oracle و Google وغيرها.. المكان الأفضل لأخذ هذه المعلومات هو من الموقع الرسمي للجهة نفسها، فالموقع نفسه سيتيح لك كافة تفاصيل التسجيل والمحتوى التعليمي والامتحانات أيضاً. بالنسبة لأوراكل، تتيح مسار ابتدائي مجاني يدعى Oracle Explorer، حيث تستطيع فيه التعرّف على المسارات المتاحة واختبار طبيعة المحتوى وإجراء بعض الامتحانات البسيطة وبعدها يمكنك الانتقال إلى مسار محدد من المسارات الموجودة مثل: Java SE7, Java SE 11،...إلخ وبمستويات مختلفة associate و professional وبعد الانتهاء من التدريب يتم دفع تكاليف الامتحان عند الرغبة بإجرائه. جميع التفاصيل المتعلقة بشروط الامتحان والمواضيع التعليمية ستجدها عند الدخول إلى تفاصيل كل مسار من الموقع الرسمي لأوراكل.
  19. إن كود الجافاسكريبت يتم تنفيذه والتعامل معه من طرف المستخدم أي متصفح الويب، أما كود PHP فهو من طرف خادم الويب والذي بدوره يستقبل البيانات من المستخدم ويتعامل مع قاعدة البيانات. ومع أن الكود لكل منهما موجود في نفس الملف الذي يقوم المبرمج بكتابته أحياناً لذلك لتوضيح الأمر يمكنك اعتبار أن كل من PHP و الجافاسكريبت لا يمكنهم الوصول إلى نفس المتغيرات بشكل مباشر، بل يتم ذلك من خلال مرحلتين: إما عند تحميل الصفحة من الخادم، بحيث يتم إرسال قيم معيّنة من PHP إلى طرف المستخدم وبالتالي الوصول إليها من خلال الجافاسكريبت. أو من خلال إرسال طلبات HTTP (GET, POST, PUT, DELETE) من طرف المستخدم (أي الجافاسكريبت) إلى خادم الويب PHP. والتي تكون أحياناً على هيئة نماذج forms وحقول إدخال أو باستخدام fetch,axios من الجافاسكريبت. لذلك لا يمكنك بشكل مباشر الوصول إلى القيم الموضوعة بواجهة المستخدم أو تحويل كود جافاسكريبت نفسه إلى PHP بل يجب إرسال القيم المراد تخزينها في قاعدة البيانات إلى طرف الخادم وذلك يختلف تطبيقه في حال كنت تستعمل أطر عمل من طرف الخادم أو مكتبات أخرى والمكان الذي تقوم بحفظ بيانات السلة فيه (في بعض الأحيان ضمن الجلسة session أو التخزين المحلي في المتصفح Local Storage). يوجد عدّة طرق لتحويل النص string إلى int ومنها: $num = "30"; $int = (int)$num; أو في حال كان الرقم من نمط double: $num = (double) "10.12"; مثال عام للتعامل مع الجلسات عند التعامل مع بيانات السلة في PHP: <?php //POST عندما يقوم المستخدم بالضغط على زر إضافة إلى السلة يتم إرسال طلب if (isset($_POST['product_id'], $_POST['quantity']) && is_numeric($_POST['product_id']) && is_numeric($_POST['quantity'])) { $product_id = (int)$_POST['product_id']; //الرقم المعرّف للمنتج الموجود في قاعدة البيانات $quantity = (int)$_POST['quantity']; // الكمية التي تم اختيارها من المنتج $stmt = $pdo->prepare('SELECT * FROM products WHERE id = ?'); $stmt->execute([$_POST['product_id']]); //جلب بيانات المنتج من قاعدة البيانات $product = $stmt->fetch(PDO::FETCH_ASSOC); //التحقق من أن كمية المنتج متاحة (اختياري) if ($product && $quantity > 0) { if (isset($_SESSION['cart']) && is_array($_SESSION['cart'])) { if (array_key_exists($product_id, $_SESSION['cart'])) { //في حال كان المنتج موجود مسبقاً في السلة $_SESSION['cart'][$product_id] += $quantity; $_SESSION['total'] = $product['price'] * $quantity; //حساب السعر } else { // إضافة منتج جديد للسلة في حال لم يكن موجوداً $_SESSION['cart'][$product_id] = $quantity; $_SESSION['total'] = $product['price'] * $quantity; //حساب السعر } } else { $_SESSION['cart'] = array($product_id => $quantity); } } } واعتبرنا في هذا المثال أنك تستخدم الجلسة نفسها بين الخادم ومتصفح الويب لحفظ الجلسة، ولكن بطريقة مشابهة يمكنك استخدام $_POST مثلاً في حال طلبات HTTP المباشرة أو إرسال نموذج form مباشر. يمكنك أيضاً البحث أكثر عن طرق إرسال واستقبال البيانات بين جافاسكريبت وطرف الخادم PHP على الانترنت وتطبيق الطرق التي تلائم حاجتك والتقنيات التي تستخدمها في مشروعك.
  20. حتى تحصل على إجابات دقيقة لسؤالك، يجب عليك ذكر المزيد من التفاصيل: ماهي لغات البرمجة التي تقوم باستخدامها؟ أي أطر عمل أو مكتبات؟ كما يمكنك إرفاق الأجزاء الخاصة بالشيفرة البرمجية أو المحاولات التي جربتها وأية مشاكل أو رسائل خطأ واجهتك. يمكنك الاطلاع على بعض الأمثلة لكيفية طرح الأسئلة ضمن أكاديمية حسوب من خلال الرابط التالي: كيف تحصل على إجابة لسؤالك؟
  21. لقد تم الإجابة مسبقاً على سؤالك ويمكنك الرجوع إلى الإجابات من هنا: وأيضاً ستجد المزيد من المعلومات من خلال المقال التالي:
  22. الكود غير مكتمل ولم أتمكن من تحديد ما إذا كنت تستخدم stateful أو stateless. ولكن من الأفضل استخدام setState لتغيير حالة المتغيرات في حال كانت ستغيّر من حالة الواجهة لديك بدلاً من تعديل قيمة resposnebody بشكل مباشر، عن طريق إضافة مؤشر من نمط boolean مثلاً للدلالة على أنه تم تحميل البيانات بشكل كامل من الخادم setState(() { _loaded = true; }); وعندها يمكنك التحكّم بعدم الوصول إلى جزء الكود الذي يعتمد على طول المصفوفة length في حال كانت قيمة هذا المتغيّر false. وإذا كنت تستخدم النسخ الأخيرة من dart ستتمكن من تجنب هذه الأخطاء من خلال خاصيات null safety. كما يجب عليك استخدام try و catch عند طلبات التعامل مع خادم الويب لتجنب الأخطاء التي قد تحدث عند عدم القدرة على جلب البيانات أو الاتصال بالخادم.
  23. لنستطيع مساعدتك بشكل أفضل، هل يمكنك توضيح السؤال أكثر؟ ماهي المشكلة التي تواجهك بالتحديد، صورة أو اقتباس عن رسالة الخطأ، ماهو البرنامج أو الخدمة التي تحاول العمل عليها..إلخ. يمكنك الاطلاع على بعض الإرشادات التي تساعدك على طرح السؤال بالضغط على (كيف تحصل على إجابة لسؤلك؟)
  24. يمكنك قراءة التعليقات على نفس السؤال فيها شرح كامل عن الموضوع: وأيضاً المقال الشامل عن مكونات React:
  25. لديك مشكلة ما في ملف build.gradle تأكد من بنية الملف والشيفرة البرمجية ضمنه بأن تكون بنفس الهرمية التالية: buildScript { // ... } plugins { // ... } repositories { // ... } من الممكن ظهور رسالة الخطأ في حال تم تغيير هذا الترتيب، أو إضافة شيفرات برمجية خارج هذه الأجزاء بشكل مباشر ضمن الملف. ولكن لا يمكن توقّع حل المشكلة دون إرفاقك للشيفرة البرمجية الموجودة ضمن الملف.
×
×
  • أضف...