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

Sam Ahw

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

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

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

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

    16

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

  1. من الصعب مساعدتك دون روئية أي جزء من الكود. ولكن بفرض أنه يتم استخدام == في عملية المقارنة، وهذا يعني أنه سيتم مقارنة في حال كان المتغيرين يدلان على نفس المكان في الذاكرة بدلاً من اختبار القيمة الحقيقية لكل متغيّر، وبالتالي ستعيد false. أما لاختبار قيم المتغيّرات من نوع integer يتم استخدام Integer.equals بدلاً من ==، مثال: if (firstNumber.equals(secondNumber){ System.out.println("true"); }else{ System.out.println("false"); }
  2. وفقاً للتوثيق الرسمي في لارافل، إن جميع القيم المشفرة في لارافل يتم تشفيرها من خلال مايعرف بـ MAC - message authentication code. ولذلك لا يمكن تغيير التشفير لقيمة تم تشفيرها مسبقاً من خلال مشروع آخر. أي بمعنى آخر، قد تحدث المشكلة نتيجة لتغيير المفتاح في المشروع، ويتم ذلك عادة عند نقل المشاريع أو نسخ الأكواد بين مشروع وآخر، وبالتالي يتغيّر App Key في مشروع لارافيل وعند التعامل مع البيانات المخزّنة مسبقاً في قاعدة البيانات والتي تم تشفيرها من خلال مشروع آخر تحدث هذه المشكلة لأنه لا يمكن لقيمة App key الجديدة من فك تشفير البيانات السابقة والتي تم حفظها بشكل مشفّر مسبقاً من خلال المفتاح السابق. مما قد يؤدي أيضاً في حالتك لتشفير بعض البيانات في القاعدة بمفتاح وبيانات أخرى بمفتاح آخر وهي التي في حالتك تظهر فيها هذه المشكلة عدى عن الأخرى. لذلك يجب التأكد من قيمة App Key عند نقل المشاريع التي يتم التعامل فيها مع نفس البيانات على خوادم قواعد البيانات. ومن إحدى المشاكل التي قد تطرأ أيضاً اختلاف أنماط تخزين كلمة المرور بين قاعدة بيانات وأخرى بين نسخ لارافل من النمط varchar(191) والتي بدورها لا تستطيع تخزين كامل القيمة المشفرة لكلمة المرور بل يتم تخزين جزء منها فقط. لذلك ينصح أيضاً عند التعامل مع مشاريع مختلفة أو نسخ مختلفة تحويل حقل كلمة المرور إلى النمط longtext أو text وخاصةً عندما تكون كلمات المرور غير محددة الطول.
  3. لقد نسيت تحديد نوع الرد response الخاص بالملف (responseType) من نمط blob. ولذلك قد يظهر الملف بشكل معطوب أو لا يتم تحميله نهائياً. لحل المشكلة يمكن تعديل الكود لديك وإضافة التالي: const options = { method: 'POST', responseType: 'blob', <=== ضرورية عند التعامل مع الملفات data: formData, url: '/your_api_link', }; return myAPI.request(options);
  4. تدعى هذه الصورة التي تظهر في المتصفح باسم fav icon، ويتم تضمينها من خلال إضافة أسطر برمجية محددة ضمن الترويسة head في الصفحة الأساسية للموقع. مثال: <link rel="shortcut icon" href="http://example.com/favicon.ico" /> ولكن قد يختلف أحجام الصورة و كود تضمينها حسب الأجهزة والمتصفحات، فعلى سبيل المثال نقوم بإضافة التضمين التالي من أجل متصفح safari من آبل: <link rel="apple-touch-icon" href="http://example.com/images/apple-touch-icon.png" /> ولكن يمكن اختصار هذه العملية بالتوجه إلى الانترنت وكتابة favicon generator فهنالك العديد من المواقع التي تسمح لك برفع الصورة المرغوب إضافتها وهو يقوم بدوره بإعطائك جميع الأحجام لها والأكواد التي يجب إضافتها ضمن الترويسة.
  5. أين الكود الخاص بالمتحكّم المسؤول عن تسجيل الخروج؟ لأن ذلك يعتمد على آلية التوثيق التي يتم اعتمادها في مشروعك كما يجب ربط المسار logout لديك بالمتحكّم الذي سيقوم بتسجيل الخروج وإنهاء الجلسة session الحالية للمستخدم، فيكون بشكل مشابه للتالي: public function logout(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); } حيث يتم بالسطر الأخير إعادة التوجيه إلى الصفحة الرئيسية للموقع للتأكد من الخروج من الصفحات التي تحتاج للتوثيق. وأيضاً في حال لم يتم تعريف المسار logout يجب أيضاً إضافة السطر التالي ضمن ال web routes: $this->post('logout', 'Auth\LoginController@logout')->name('logout');
  6. في حال كنت ترغب بالحصول على بعض البيانات من Twitter فيجب عليك التعامل مع API الخاصة به. وذلك يتطلب منك تسجيل حساب مطور في تويتر والحصول على API ثم المرور بكامل الخطوات التي تتطلب تسجيل الدخول، توثيق الطلبات،...إلخ. وصولاً إلى الطرفية التي تلبي طلبك، حيث ستجد العديد من الطرفيات end-points والتي لكل منها وظيفة معيّنة، مثل البحث عن مستخدمين والحصول على بيانات محددة أو إحصائيات. وهذه التفاصيل تجدها مشروحة بشكل مفصّل ضمن التوثيق الرسمي في تويتر، ولكنه يتطلب منك بعض الخبرة في التعامل مع API و طرق التوثيق وغيرها.
  7. يمكنك إضافة اسم صف لهذه الحقول، وليكن في مثالك brand-name، ثم تستطيع الحصول على هذه القيم ضمن مصفوفة باستخدام حلقة تكرارية: var inputs = $(".brand-name"); for(var i = 0; i < inputs.length; i++){ console.log($(inputs[i]).val()); } أما بالنسبة لتخزينها في قاعدة البيانات، فذلك يعود لبنية الجدول لديك، وإحدى الحلول هو تحويل هذه المصفوفة إلى سلسلة نصية والفصل بين العناصر باستخدام إشارة معيّنة (فاصلة مثلاً) من خلال استخدام implode في PHP: implode(",",$arr); ثم عند استعادتها تقوم بتحويلها من جديد إلى مصفوفة عن طريق استخدام explode في PHP: explode(",",$str); وفي حال كانت بنية الجدول هو تخزين هذه القيم بشكل منفصل تستطيع مباشرةً تخزين كل قيمة على حدى.
  8. إن السبب في استخدام self لأن لغة بايثون لا تستخدم الترميز @ للدلالة على الغرض المنشأ، ولكن لدينا توابع التي تمرر بدورها هذا الغرض بشكل أوتوماتيكي ولكن لا يتم استقباله بشكل اوتوماتيكي فلذلك يجب علينا ذكر self بشكل صريح. ويعود استخدامها للدلالة على غرض من هذا الصف ولإتاحة إمكانية الوصول إلى بيانات وتوابع هذا الصف فتقوم بربط المتغيّرات مع القيم المعطاة. مثال بسيط عن تمرير القيم واستخدام الباني مع self: class library(): def __init__(self, book, author): self.book = book self.author = author def show(self): print("book is", self.book) print("author is", self.author ) anyLibrary = library("book1", "John") anotherLibrary = library("book2", "Smith") anyLibrary.show() anotherLibrary.show()
  9. يمكنك استخدام المكتبة itertools بالشكل التالي: import itertools anylist = [[1,2,3],4,5,[7],[8,9]] merged = list(itertools.chain(*anylist)) وبشكل مشابه أيضاً استخدام itertools.chain.from_iterable: merged = list(itertools.chain.from_iterable(list2d)) وبشكل يدوي، يمكنك البحث عن مصطلع flat ضمن المصفوفات في بايثون، فيمكنك إجراء السابق بنفس الطريقة من خلال: newList = [item for childList in t for item in childList] والتي تماثل: newList = [] for childList in t: for item in childList: newList.append(item)
  10. السبب في ذلك هو أن إشارة = في بايثون لا تقوم بالنسخ، وإنما تقوم بإنشاء ما يدعى binding بين المتغيّرين. لذلك يجب عليك استخدام التالي: arr2 = arr1.copy() مثال: from numpy import * arr1 = array([2, 6, 9, 4]) arr2 = arr1.copy() # إجراء تعديل على أي مصفوفة منهما arr1[1] = 7 وهو ما يدعى ب deep copy.
  11. السؤال غير واضح فلا نعلم ماهو إطار العمل أو النوع الذي تعمل عليه، ولكن إن كنت تقصد Scrollbar التابع لمواقع الويب فهو يعتمد على الخاصية overflow في تنسيقات CSS. حيث يمكنك فحص المكوّن Inspect الذي يحوي شريط التمرير الأفقي ومراقبة خاصية overflow والتي لها عدة قيم: visible: سيتم إظهار المحتوى كما هو حتى لو كان أكبر من حجم العنصر. hidden: سيتم قص المحتوى الأكبر من العنصر وإظهار الجزء الظاهر فقط. scroll: مشابهة ل hidden ولكن سيظهر شريط التمرير هنا دوماً في العنصر لرؤية بقية المحتوى في حال تجاوز حجم العنصر. auto: مشابهة ل scroll ولكن سيتم إضافة شريط التمرير scrollbar فقط عند الحاجة له. كما يمكنك تزويد الخاصية x للدلالة على الشريط الأفقي، و y للدلالة على الشريط العمودي، وبالتالي إخفاء وإظهار شريط التمرير من خلال CSS يكون بالشكل التالي: div { overflow-x: hidden; /* إخفاء شريط التمرير الأفقي */ overflow-y: scroll; /* إظهار شريط التمرير العمودي */ }
  12. يمكنك الحصول على IP Address من خلال: req.connection.remoteAddress بحيث يمكنك الحصول على العنوان حسب نوع الاتصال من اتصال http أو من socket,... req.ip req.connection.remoteAddress req.socket.remoteAddress req.connection.socket.remoteAddress; وبعدها يمكنك إنشاء حلقة تكرارية للمرور على المصفوفة التي تحوي العناوين المحظورة ومقارنة هذا العنوان بها، بشكل مشابه للتالي: if(blackList.indexOf(ip) > -1) { res.end(); // إنهاء الطلب في حال كان العنوان موجود } ولكن يوجد العديد من المكتبات الجاهزة التي يتم استخدامها مع express ومنها: express-ipfilter و express-ip-block والتي ستسهّل عليك العمل وتوفّر لك العديد من المزايا الإضافية.
  13. بما أن اللعبة ستكون موجهة لتطبيقات الموبايل، فيمكنك البدء بلغات البرمجة التي يتم استخدامها لتطوير الألعاب على الموبايل ومنها Unity بحيث يمكنك من خلال Unity ولأنها cross-platform برمجة الألعاب ونشرها على كامل المنصات أو نظم التشغيل دون الحاجة لإعادة برمجتها لكل جهاز على حدى. ولكن لتنفيذ هذا النوع من الألعاب لا يوجد أدوات خاصة أو تقنيات مخصصة لهذا النمط فقط. يجب عليك تفصيل اللعبة من وجهة نظر المبرمج وعندها ستتبسط الأمور لديك وتستطيعين إنجاز كل جزء على حدى. ويمكنك البدء بتعلّم تحريك الأغراض، التحكم بالإحداثيات، إضافة الأغراض،...إلخ. وعندها سيتم تجميع هذه المهارات لبناء أي لعبة مهما كان الهدف منها.
  14. لجعل الواجهات متجاوبة مع جميع الشاشات يجب استخدام ConstraintLayout، والتي تعتمد على مفهوم ربط العناصر ضمن الواجهة تبعاً للمسافات والعلاقات فيما بينها، وبذلك تحافظ هذه العناصر على أبعادها مهما اختلفت حجوم الشاشات ويمكن أيضاً أن تتم زيادة أو إنقاص حجومها بشكل متجاوب حسب أبعاد الشاشة وبالتالي تصبح الواجهات متجاوبة مع جميع الشاشات. لأنه تحدث لديك هذه المشاكل عند استخدام قيم ثابتة أثناء وضع العناصر ضمن الواجهة وبالتالي لا يمكن إزاحتها بالشكل المناسب أو التحكم بعناصر الواجهة حسب الأبعاد. كما وينصح أيضاً بتصميم واجهات مخصصة لحجوم الشاشات الكبيرة (آيباد) لأنه غالباً سيتم إتاحة مساحة كبيرة جداً بالمقارنة مع حجوم شاشات أجهزة الموبايل. كما يمكنك التعرّف على المزيد من التفاصيل حول ConstraintLayout وطريقة استخدامها والنصائح الأخرى الموجودة في هذا الموضوع من التوثيق الرسمي في اندرويد ستوديو.
  15. إن مجال برمجة الألعاب واسع جداً لذلك يجب عليك أولاً تحديد المنصة التي سيتم تشغيل اللعبة عليها وبناءً على ذلك يتم تحديد لغات البرمجة أو المنصات اللازمة لإنجازها. فمثلاً ألعاب الويب مختلفة عن ألعاب تطبيقات الجوال والتي بدورها تختلف عن ألعاب الحاسوب، ولكل نوع منها لغات برمجة وتقنيات مخصصة. وبعد تعديد ذلك لن يختلف معك نوع اللعبة فيمكنك تنفيذ أي نوع من الألعاب ضمن التقنيات التي اخترتها على سبيل المثال Unity، فلا يوجد أطر عمل محددة للعبة سباق السيارات مثلاً وأخرى لنوع آخر من الألعاب. لذلك، يجب عليك أولاً تحديد ماهو الجهاز الذي سيقوم بتشغيل اللعبة ومن ثم استكشاف اللغات والتقنيات المستخدمة لبرمجة الألعاب على هذا النظام، وبعدها التعمّق أكثر وتعلّم برمجة الألعاب ضمنه.
  16. إن شهادة حسوب معتمدة من قبل الأكاديمية ويمكن التحقق منها ومن وثوقيتها بأي وقت من خلال الكود الموجود فيها. أما بالنسبة للجهات الأخرى والدول فأنت هنا تحصل على شهادة من أكاديمية الكترونية وليس من جامعة حتى تكون الشهادة معتمدة تبعاً لأنظمة التعليم المختلفة في هذه الدول. وهذا هو الحال بالنسبة لأي شهادة دورات على الانترنت. ولكن كونك لن تحصل على الشهادة إلا بعد اجتياز اختبار مقدّم من الأكاديمية فهذا يعطيها أفضلية عن الشهادات الأخرى. وعموماً معظم الشركات لن تنظر فقط إلى الشهادة بغض النظر عن من قام بإصدارها وخصوصاً في البرمجة لأنه تبقى مهاراتك والخبرة التي لديك هي الإثبات الوحيد. لمزيد من المعلومات حول الشهادة والاختبار يمكنك التواصل أيضاً مع فريق الدعم (من هنا) في حال كان لديك أي سؤال أو استفسار بهذا الخصوص.
  17. يمكنك ذلك عن طريق استخدام savefig وهي اختصار لـ (Save Figure): savefig(fname, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype=None, format=None, transparent=False, bbox_inches=None, pad_inches=0.1, frameon=None, metadata=None) مثال مع وضع اللاحقة المناسبة لصورة أو ملف pdf: plt.savefig('image.png') plt.savefig('image.pdf') فمثلاً يمكننا أيضاً حذف المساحة الفارغة البيضاء منها عن طريق إضافة الخيار التالي التالية: plt.savefig('image.png', bbox_inches='tight') ويمكنك الاطلاع على المتغيرات الموجودة في هذه الدالة وعلى بقية الدوال الموجودة وكيفية استخدامها مع شرح تفصيلي لكل منها من خلال التوثيق الرسمي للمكتبة.
  18. من إحدى وأهم الفروقات هو إمكانية إضافة middlewares على مستويات مختلفة. فباستخدام app: app.get('/', [.....],) يمكننا تطبيق وسيط middleware على مستوى التطبيق App Level. أما باستخدام router: router.get('/',[...]) يمكننا تطبيق وسيط middleware فقط على مستوى التوجيهات routes. ويوجد أهمية كبيرة لمستوى تطبيق بعض الوسائط خاصة فيما يتعلق بالحماية الأمنية للتطبيق أو فرض تحقق معيّن أو صلاحيات محددة. ويوجد العديد من الوسائط التي ينصح باستخدامها على مستوى محدد بدلاً من غيره.
  19. توفر لارافل العديد من الوسائل التي تمكنك من اختبار مشروعك والتي تم تحسينها في النسخ الحديثة من لارافل لتشمل جميع جوانب المشروع وهي: HTTP Tests: والتي تمكنك من اختبار ارسال الطلبات إلى الخادم واستقبالها من طرف الزبون ومحاكاة هذه الآلية ضمن مشروعك Console Tests: وهي مشابهة لطلبات http ولكن تمنحك إمكانية إجراء التعليمات بكتابتها بشكل يدوي عبر ال console Browser Tests: الاختبارات على مستوى المتصفح، والتي تم دمجها مع Laravel Dusk، والتي تمكنك من اختبار جميع الخصائص ضمن المتصفح من ملفات تعريف الارتباط، الأزرار، التحقق والتوثيق، استخدام لوحة المفاتيح والفأرة، والعديد من الخصائص.. Database: ويتم فيها تنفيذ الاختبارات على مستوى قواعد البيانات، بما تحويه من معالجة البيانات والعلاقات فيما بينها وعلى مستوى models أيضاً عن طريق استخدام factories دون أن تحتاج لإضافة البيانات إلى الجداول بشكل يدوي وإشغال مساحة دون الحاجة لها. Mocking: والتي تمنح القدرة على اختبار وحدة برمجية بشكل مستقل في حال أردت اختبار عمليات برمجية مرتبطة مع بعضها البعض أو مع أحداث أخرى، بما تحويه من mocking objects ، mocking facades، .... جميع هذه الجوانب تحوي العديد من الطرق والتفاصيل التي يصعب جمعها في مكان واحد، لكن لسهولة البدء يمكنك التوجه إلى التوثيق الرسمي في لارافل واختيار موضوع محدد حسب حاجتك للاختبار والاطلاع على كامل التفاصيل عن هذا النوع الذي اخترته من الاختبار والذي يلبي حاجتك.
  20. يجب إضافة التضمين التالي ضمن ملف الاستعلام: use Rebing\GraphQL\Support\Type as GraphQLType; والوراثة من الصف GraphQLType، وأيضاً يجب إعادة return لحقول الخصائص المعرفة ضمن resolvers هذا الغرض فيصبح الكود بالشكل التالي: <?php namespace App\GraphQL\Types; use App\Wine; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Type as GraphQLType; class ItemType extends GraphQLType { return [ 'id' => [ 'type' => Type::nonNull(Type::int()), 'description' => 'Id of the item', ], 'name' => [ 'type' => Type::nonNull(Type::string()), 'description' => 'The name of the item', ], ]; } وأيضاً ضمن الملف graphql، يجب التأكد من تضمين الصفين: use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Query; ومن ثم يمكن إنشاء ملف منفصل للاستعلامات: <?php namespace App\GraphQL\Queries; use App\Item; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Query; class ItemQuery extends Query { protected $attributes = [ 'name' => 'item', ]; public function type(): Type { return GraphQL::type('Item'); } public function args():array { return [ 'id' => [ 'name' => 'id', 'type' => Type::int(), 'rules' => ['required'] ], ]; } public function resolve($root, $args) { return Item::findOrFail($args['id']); } } ويمكن استعادتها بالجمع عن طريق استخدام listOf: public function type(): Type { return Type::listOf(GraphQL::type('Item')); } public function resolve($root, $args) { return Item::all(); }
  21. يجب عليك إضافة implements SluggableInterface ضمن المودل الذي تقوم باستخدامه: class Item extends Eloquent implements SluggableInterface { .... } وبعدها ستتمكن من استخدامها بالشكل التالي: $item = Item::create([ 'title' => 'This is an item', ]); echo $item->slug;
  22. قد يظهر هذا الخطأ عادةً نتيجة لعدد أسباب: إما أن يكون جدول ما في قاعدة البيانات لا يحوي أي مفتاح أولي أو ثانوي، أو عندما يتم إدخال القيمة null على مفتاح فريد أو قد يظهر أيضاً نتيجة لاختلاف إعدادات بين الإصدارات في حال تم تعديلها. وبدءً من الإصدار الخامس، سيظهر هذا الخطأ عند محاولة إجراء التعليمات INSERT/UPDATE/DELETE على مستخدمي قاعدة البيانات. حيث يجب استبدالها بالتعليمات التالية: GRANT/DROP/CREATE USER. وأخيراً، يظهر هذا الخطأ أيضاً في حال اختلف نمط الجداول بين MyISAM و InnoDB يجب عليك التأكد من أن النمط نفسه موجود في قاعدة البيانات لديك ضمن بيئة التطوير والموجودة على السيرفر.
  23. الأرقام السالبة تدل على أننا نقوم بعد العناصر بالاتجاه المعاكس، أي نبدأ من اليمين إلى اليسار بدلاً من الترتيب العادي، ويمكن استخدامها أيضاً في الاقتطاع حسب المطلوب لديك من اليسار أو من اليمين كما هو موجود ضمن التعليق السابق. مثال على مصوفة تحوي عدة أرقام: >>> [1,2,3,4,5,6,7,8][:5] [1, 2, 3, 4, 5] >>> [1,2,3][:5] [1, 2, 3] >>> x = [6,7,8,9,10,11,12] >>> x[:5] [6, 7, 8, 9, 10]
  24. في الصورة المرفقة سابقاً قمت بإنشاء الغرض Scanner مرتين، مرة بداخل التابع الأساسي main ومرة أخرى في التابع الآخر، ويجب عليك استخدامها مرة واحدة في حال أردت تمرير المتغيرات بين التوابع أو حسب استخدامك لها. أما بالنسبة للخطأ، في حال لم يتم حل المشكلة بعد هذه التعديلات يمكنك إرفاق الكود الذي تحاولين كتابته والخطأ الذي يظهر لك.
  25. الإدخال من المستخدم في جافا يتم عن طريق استخدام System.in وهو standard input stream ويمكننا السماح بالإدخال حسب نمط البيانات الذي ننتظر من المستخدم أن يقوم بإدخاله، مثل sc.nextLine لإدخال سلسلة نصية String أو nextInt لإدخال أعداد. مثال بسيط لإدخال الأرقام وطباعة مجموعها: import java.util.*; class UserInputDemo { public static void main(String[] args) { Scanner sc= new Scanner(System.in); System.out.print("Enter first number- "); int a= sc.nextInt(); System.out.print("Enter second number- "); int b= sc.nextInt(); System.out.print("Enter third number- "); int c= sc.nextInt(); int d=a+b+c; System.out.println("Total= " +d); } } والبرنامج السابق في المثال سيسمح للمستخدم بإدخال 3 أعداد ثم سيقوم بطباعة الناتج.
×
×
  • أضف...