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

Wael Aljamal

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

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

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

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

    218

كل منشورات العضو Wael Aljamal

  1. تابع حل المشكلة لتعرف السبب، على كل حال يمكنك تجريب flutter_pay يوجد جدول في الأسفل يوضح التقنيات التي تعمل معها و تتوفر visa لكلا نظامي android + ios وجدت أيضا: stripe_sdk و stripe_payment razorpay - flutter_credit_card بالتوفيق
  2. مرحبا مجددا، تأتي قيمة applicationId من build.gradle في moudle في قسم الأندرويد ابحث عن الجزئية التالية وعدل الاسم حسبها: أرجو الانتباه للتوافق انظر للجزء applicationId "com.example.myapp" android { defaultConfig { applicationId "com.example.myapp" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } ... } وبهذه الحالة سوق يتم قراءة معرف التطبيق applicationId من Gradle ثم إسنادها إلى androidMainfest أي اترك العبارة التالية مثلما هي: <data android:scheme="${applicationId}.braintree" /> في الجزء <activity android:name="com.braintreepayments.api.BraintreeBrowserSwitchActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="${applicationId}.braintree" /> </intent-filter> </activity> شكرا لك
  3. استخدم عملية الطباعة الجزئية في كل مرحلة من التطبيق لتعرف في أي لحظة يتوقف دعم البيئة لعملية حفظ الترميز. ربما إضافة الجزئية التالية لـ HTML form الذي يرسل البيانات سيحل المشكلة: accept-charset="utf-8" <form action="/action_page.php" accept-charset="utf-8"> <label for="fname">First name:</label> <input type="text" id="fname" name="fname"><br><br> <input type="submit" value="Submit"> </form> كي لايتم إرسال البيانات بترميز مختلف. ولحل المشكلة من طرف PHP قم بوضع الترويشة في بداية ملفات php بعد وسم الفتح مباشرة: <?php header('Content-type: text/plain; charset=utf-8'); بالتوفيق
  4. مرحبا محمود، يكون شكل ترميز emojis بهذه الطريقة: u+1F60A وهي نفسها مستخدمة في مختلف أنظمة التشغيل. لكي نستعملها في مواقع الويب يجب أولا أن تدعم صفحة HTML الترميز UTF-8 بوضع التعليمة التالية في قسم head في أول الصفحة: <meta charset="UTF-8"> في حال لم يتم ترجمة ترميو الرمز تلقائيا يجب تغعيل دالة جافاسكربت أو php (مثلما تريد) لاستبدال جزء النص +U بالتالي: &#x u+1F60A => &#x1F60A; المثال السابق يعرض الفرق بين كيفية تخزين رمز تعبيري و طريقة تحويله لكي يُعرض في صفحة ويب. مع إضافة فاصلة منقوطة لنهاية الترميز. استخدم دالة جاهزة مثل replace. مثال لعمل الترميز: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <h1>Sized Emojis</h1> <p style="font-size:48px"> &#128512; &#128516; &#128525; &#128151; </p> </body> </html> بالتوفيق
  5. مرحبا مروان، هل قمت بربط التطبيق مع الخدمة بشكل صحيح في الجزء التالي: <activity android:name="com.braintreepayments.api.BraintreeBrowserSwitchActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="${applicationId}.braintree" /> </intent-filter> </activity> حيث يوجد قيود في حقل applicationId: يقول: Important: Your app's URL scheme must begin with your app's package ID and end with .braintree. For example, if the Package ID is com.your-company.your-app, then your URL scheme should be com.your-company.your-app.braintree. ${applicationId} is automatically applied with your app's package when using Gradle. Note: The scheme you define must use all lowercase letters. If your package contains underscores, the underscores should be removed when specifying the scheme in your Android Manifest. أظن أنه عليك تعديل هذه الجزئية لإتمام عملية التحقق من أن التطبيق يتبع لنفس الحساب. (يجب أن تحوي على حروف صغيرة فقط و بدون شرطة سفلية)
  6. مرحبا بيان، لنفكر بالمشكلة بطريقة منطقية، نلاحظ ارتباط رقم السطر مع قيمة الرقم و عدد تكراراته. نريد أولا حلقة for تقوم بالتكرار بعدد الأسطر المراد طباعتها ولنفرض أننا سنتحرك ضمن المجال 1 .. 3 ولكل تكرار من الحلقة الأولى - نأخذ قيمة العداد i - و نكرر طباعتها بقيمة العداد نفسه. يمكننا استخدام حلقة for ثانية بعد نهاية الحلقة الداخية نطبع سطر جديد و يتابع البرنامج التنفيذ في الحلقة الأولى. وينقل التنفيذ للتكرار التالي. وهذا برنامج مساعد لحل المكشلة، أرجو الإعتماد على نفسك في الحل قبل رؤية الكود التالي: . for i 1 .. 3 for k 1 .. i print the number i end print new line end بالتوفيق
  7. هذا جيد لكي يدعم Gradle بناء تطبيقات مع محدثة مع توافقة لأعلى و الإستفادة من تجسين المعالجة compilation في جافا. تمام، أغلب إصدارات المكتبة تدعم العمليات الأساسية و ستعمل بالمشروع، في حال وجود تقنيات دفع لم تعمل معهم تستطيع مراجعة التوثيق في حال وجود شروحات. أتمنى لك التوفيق
  8. هذه ليست تعليمة برمجية، ما قصدته هو من قائمة file في أندرويد استديو تختار invalidate Cahces/restart ليتم حذف الملفات المؤقتة من المشروع. --------------- حسب توصيات المكتبة و لعمل توافق بينها و بين gradle نصحو بالتالي: تحديد أقل نسخة تطوير ل 21 In /app/build.gradle, set your minSdkVersion to at least 21. و تحديد إصدار المكتبة dependencies: flutter_braintree: 0.6.0 قبل ذلك حاول حذف +1 من إصدار المكتبة. كل هذه مشاكل توافقية و علينا تجريب تغييرهم
  9. ما القيمة المقابلة لديك في مشروع أندرويد : classpath 'com.android.tools.build:Gradle:3.5.0' أرجو تنفيذ التعليمة: android stuio: file->invalidate Cahces/restart شكرا
  10. مرحبا مروان، سنحاول تحديد إصدار المكتبة بعد إزالة ^ من إصدار المكتبة: dependencies: flutter_braintree: ^1.1.0+1 لتصبح dependencies: flutter_braintree: 1.1.0+1 ثم إعادة تنفيد : flutter pub cache repair ثم flutter pub get شكرا لك
  11. مرحبا، انت تضع رابط التحويل للحساب الشخصي، وليس رابط حسابك. الرابط المستخدم يعرض أعمال الشخص نفسه وليس غيره. أرجو تعديله.
  12. مرحبا، يعمد INNER JOIN على ربط العناصر المتساوية بين عمودي جدولين أما OUTER JOIN يعمل على وضع جميع عناصر أحد الجدولين ثم وضع مقابلها من الجدول الآخر في حال وجود قيم متساوية. الجدول الذي سيتم وضع جميع قيمه يمكن أن يستدل عليه من موقعه ضمن عبارة SQL بالنسبة للكلمات المفتاحية التالية (الجدول الرئيسي في عملية الدمج) LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN المثال الذي سنطبق عليه التمارين هو التالي: الفراغات تدل على عدم وجود قيمة مقابلة من العمود المختار من الجدول الآخر (الغير رئيسي) في عملية الدمج. Set "A" Set "B" AA BB -------- -------- Item 1 Item 3 Item 2 Item 4 Item 3 Item 5 Item 4 Item 6 LEFT JOIN: SELECT * FROM A LEFT JOIN B ON AA = BB AA BB -------- -------- Item 1 Item 2 Item 3 Item 3 Item 4 Item 4 RIGHT JOIN: SELECT * FROM A RIGHT JOIN B ON AA = BB AA BB -------- -------- Item 3 Item 3 Item 4 Item 4 Item 5 Item 6 FULL JOIN: AA BB -------- -------- Item 1 <-----+ Item 2 | Item 3 Item 3 | Item 4 Item 4 | Item 5 +--- empty holes are NULL's Item 6 | ^ | | | +---------------------+ INNER JOIN: SELECT * FROM A INNER JOIN B ON AA = BB AA BB -------- -------- Item 3 Item 3 Item 4 Item 4 كما يوجد CROSS JOIN الذي يقوم بعمل جداء ديكارتي بين كل عنصر من أول جدول مع جميع العناصر من الجدول الثاني: - تتم بدون عمل أي شرط عل البيانات - SELECT * FROM A CROSS JOIN B AA BB -------- -------- Item 1 Item 3 ^ Item 1 Item 4 +--- first item from A, repeated for all items of B Item 1 Item 5 | Item 1 Item 6 v Item 2 Item 3 ^ Item 2 Item 4 +--- second item from A, repeated for all items of B Item 2 Item 5 | Item 2 Item 6 v Item 3 Item 3 ... and so on Item 3 Item 4 Item 3 Item 5 Item 3 Item 6 Item 4 Item 3 Item 4 Item 4 Item 4 Item 5 Item 4 Item 6 NATURAL JOIN: تعمل مثل INNER JOIN ويتم مطابقة أسماء الحقول بدون الحاجة لكتابتها: SELECT * FROM A NATURAL JOIN B +----------+------- matches on the names, and then the data | | v v XX XX -------- -------- Item 3 Item 3 Item 4 Item 4 رسم توضيحي لعملية تقاطع الجداول: بالتوفيق
  13. نوع الخط يعتمد على المجتمع الذي يقدم فيه المنتج و أعتقد أن الخط الصفير من البيئة المغربية وهو مفهوم لهم. أقترح تبديله بـ cairo arabic أو غيره حسب رؤيتك، أنت قدمت الاستشارة في أكاديمية عربية و سيرى تصميمك الكثير من الناس من مختلف البيئات. اختر الأفضل حسب المجتمع بالتوفيق
  14. مرحبا، PHP 8.0 هو تحديث رئيسي للغة PHP. يحتوي على العديد من الميزات والتحسينات الجديدة بما في ذلك الوسائط المسماة named arguments ، وأنواع الاتحاد union types، والسمات attributes، وترويج خاصية المُنشئ constructor property promotion، وتعبير المطابقة match expression، وعامل nullsafe operator، و JIT الترجمة اللحظية للغة، والتحسينات في نظام أنماط البيانات Data Types، ومعالجة الأخطاء error handling، والاتساق consistency. Named arguments يمكننا تحديد الوسيط عن طريق اسمه حتى لو لم يكن بنفس ترتيب تعريفه في الدالة htmlspecialchars($string, double_encode: false); قديما كان يجب تمرير كل الوسطاء htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); تغيير طريقة استخدام المسارات لتصبح بالشكل التالي: class PostsController { #[Route("/api/posts/{id}", methods: ["GET"])] public function get($id) { /* ... */ } } Constructor property promotion سمحت بتعريف خواص الصنف بدالخل دالة البناء : - بدل تعريفهم ثم اسناد قيمهم .. class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} } match expression: أصبح نمط البيانات string لا يتم قصره إلى int بشكل تلقائي .. echo match (8.0) { '8.0' => "Oh no!", 8.0 => "This is what I expected", }; //> This is what I expected Nullsafe operator : اختصر وضع العديد من الشروط لإسناد قيمة للمتحول بوضع إشارة استفهام ؟ $country = $session?->user?->getAddress()?->country; بدل $country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } } بالإضافة لدوال و أصناف جديدة يمكنك أن تجدهم عبر الرابط التالي: تعديلات لغة البرمجة PHP 8 بالتوفيق
  15. حركة وضع السن بهذا الشكل جميلة، لكن الخط الصغير غير مفهوم وليس موفقا
  16. مرحبا منيه، للانتقال لقرص محدد أرجو عملها في تعليمة منفصلة (كتابة اسم القرص ثم نقطتين) c: d: e: و للانتقال لمسار محدد نستخدم التعليمة cd ثم نمرر المسار في نفس القرص. بعد الانتقال للمسار المطلوب، أرجو إعادة تنفيذ تعليمة إنشاء التطبيق (يفضل عمل مجلد خاص للمشاريع لترتيب العمل). - ملاحظة: أرجو إضافة الأسئلة الخاصة بالدروس في أسفل الدرس / قسم التعليقات. شكرا لك
  17. بالنسبة للأمان، المكتبة تعتمد نظام آمن مشفر مثل باي بال. أما أمان web view فهو أيضا موجود و تقريبا لا يفرق عن التطبيق لأن عمليات الدفع تتم من متصفح داخلي في التطبيق أي مثل أي عملية شراء عادية من موقع. بالتوفيق
  18. نستعمل web view عندما نريد عرض صفحة ويب ضمن التطبيق قد تكون مبرمجة مسبقا لاختصار عمل الدفع في التطبيق. هذه مكتبة برمجية فقط مقدمة من شركة تملكها باي بال. يمكنك فتح الرابط التالي وقراءة تفاصيل braintree-pricing
  19. مرحبا مروان، يمكنك تضمين 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 تحوي طريقة أيضا للدفع. بالتوفيق
  20. مرحبا، إن الطريقة التي تفكر بها حضرتك هي صحيحة تماماً، فإن بناء تطبيقات متعددة الأنظمة التي تدعى cross-platform صُممت لهذا الغرض، سهولة التطوير و انخفاض كلفة الصيانة و سرعة تقديم المنتج بفريق تصميم و برمجة واحد. سيكون اداء تطبيق Flutter ممتازاً و سريعا وبنفس أداء التطبيقات الاصلية (التي تُبنى بلغة برمجة مدعومة من نظام الاشغيل) لأن الشيفرة المصدرية فيها يتم ترجمتها بطريقة فعّالة و نفس ترميز اللغات الأصلية. أتمنى لك التوفيق في هذه الخطوة. تحياتي
  21. مرحبا تميم، قم بتعريف مصفوفة تحوي القيمة المعادة، عرف مصفوفة لتعيد الناتج، قم بالمرور على المصفوفة الأولى استخرج البيانات وقم بإضافتهم للإجابة، ثم يمكنك إعادة اليمة التي تريدها. <?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"; } ?> بالتوفيق
  22. مرحبا أحمد، إن التعامل مع 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 بالتوفيق
  23. مرحبا ميريام، يمكننى تقديم مساعدة لفهم الشيفرة البرمجية و ليس تقديم حل، عليك البحث على الانترنت و التعلم و التجريب حتى تنجحي. public static bool IsPalindrome(string text, int L, int R) مثلا نعرف تابع بالشكل السابق يعيد النمط bool و يأخذ سلسلة نصية. تعريف الدالة التراجعية أنها دالة تستدعي نفسها عدة مرات للوصول للحل. أي ضمن تعريفها، سيتم استدعائها عدة مرات و في كل مرة ستأخذ وسطاء مختلفين. عمل الخوارزمية: في كل مرة سوف نتأكد من تساوي قيمتين من عناصر السلسلة (الأولى و الأخيرة - الثانية و قبل الأخيرة ..) أي نتأكد من أن العنصر رقم 0 يساوي العنصر n-1 والعنصر رقم 1 يساوي العنصر رقم n-2 في كل مرة نستدعي الدالة مع وسيطين i و n-1-i ونقارنهم. بفرض وسطاء الدالة هم L - R أي العنصر الأيسر و الأيمن نتحقق في كل مرة من التالي: if (text[L] != text[R]) { return false; } ويتم استدعاء الدالة بعد اختبار الشرط مرة أخرى بتحريك الوسطاء IsPalindrome(text, L+1, R-1); إن شرط توقف الدالة هو وصول الوسطاء لفحص نفس العنصر حيث تعيد الالة إجابة عندها. أرجو إتباع الشرح وتطبيقه شكرا لكِ
  24. نعم، لقد قدم المدرب عصام نفس الملاحظة في سؤالك السابق، ترتيب الإضافة لقاعدة البيانات عند وجود مفاتيح ثانوية مهم، لأن برنامج قاعدة البيانات يتطلب وجود عنصر له id موافق في الجدول الآخر قبل إضافة سجل يعتمد عليه. من فضلك بعد تجريبك لإعادة النظر في تسلسل كن=تابة البرنامج وفي حال لم تُحل المشكلة، أرجو إرفاق المشروع. لا نستطيع تقديم حل بدون تجريب البرنامج. شكرا لك
  25. مرحبا هبة، أظن أن هذا ليس الجزء الذي يسبب خطأ، أرجو رفع ملف المشروع كاملا بشكل مضغوط ليتسنى للمدربين مساعدتك بشكل أفضل. يخبرك أن المشكلة في المفتاح الثانوي، يجب وجود مرجع لنفس العنصر مسبقا في الجدول الآخر (مفتاح ثانوي لحقل الربط ) قبل إضافة العنصر لجدولنا لتحقيق الربط بشكل صحيح. مثلا: لا يمكنك إضافة نوع حلويات جديد له تصنيف معجنات (ربطه مع category له id = 2) قبل وجودها أساس في قاعدة البيانات مثلا جدول التصنيفات. يمكنك وضع شيفرة للتأكد من وجود التصنيف مثلا وإلا إضافتها ثم إضافة نوع الحلويات الجديد. في برنامجك لا أعرف سبب وجود مرجع لرقم المستخدم (ربما عليك إضافة المستخدم نفسه لقاعدة البيانات قبل شرائه لمنتج ما) يمكنك تطبيق نفس المنطق السابق لحل المشكلة. شكرا لك
×
×
  • أضف...