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

سامح أشرف

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

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

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

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

    56

كل منشورات العضو سامح أشرف

  1. أتوقع أنك تتحدث حول دورة تطوير واجهات المستخدم، وكل هذه الدروس موجودة في الدورة بشكل ضمني، فعلى سبيل المثال إطار العمل Bootstrap مشروح في مسار "بناء واجهة مستخدم تشبه موقع YouTube" وتقنية SASS و GitHub وطريقة نشر صفحات الموقع على الإنترنت مشروحة في مسار "تطوير متجر الكتروني" .. إلخ
  2. يمكن جمع كل القيم في صف معين أو عمود معين من خلال التابع sum في مصفوفة numpy كالتالي: import numpy as np # نقوم بعمل مصفوفة ثنائية البعد 2×2 arr = np.array([[1, 2],[3, 4]]) # حساب مجموع كل صف rows = arr.sum(axis=1) print(rows) # Output: array([3, 7]) # حساب مجموع كل عمود cols = arr.sum(axis=0) print(cols) # Output: array([4, 6]) بهذه الطريقة يمكن الحصول على مجموع كل صف أو مجموع كل عمود على حدى.
  3. يمكنك أن تقوم بعمل دالة تقوم بالمرور على كل حرف من مدخلات المستخدم وتقوم هذه الدالة بإضافة علامة backslash \ قبل كل حرف أو رمز غير الحروف اللاتينية، وتوجد دالة تقوم بذلك بشكل إفتراضي في مكتبة re وهي دالة escape ويمكنك أن تستعمل الدالة كالتالي: userInput = input("Write a word: ") # Input: ^a.*$ escapedText = re.escape(userInput) # Output: \^a\.\*\$ ملاحظة عند طباعة المتغير escapedText ستكون النتيجة كالتالي: \\^a\\.\\*\\$ يتم إضافة علامة \ إضافية قبل كل علامة \، ويمكنك الإطلاع على هذه الإجابة لمعرفة سبب إضافة علامة backslash إضافية من هنا
  4. يوجد العديد من الطرق للتحقق من نوع أي كائن في بايثون: يمكنك أن تستعمل collections كالتالي: from collections.abc import Iterable if isinstance(myObj, Iterable): # myObj هو كائن قابل للتكرار else: # غير قابل للتكرار كما يمكن أن تستعمل جملة try ... except كالتالي: try: iterator = iter(myObj) except TypeError: # الكائن myObj غير قايل للتكرار else: # iterable كما يمكنك أن تستعمل الدالة iter كالتالي: try: iter(myObj) # في الغالب هذا الكائن قابل للتكرار except TypeError: print('not iterable') طريقة أخرى وهي إستعمال الدالة getatter للتحقق من وجود الخاصية __iter__ في الكائن والتي تكون موجودة في الكائنات القابلة للتكرار، كالتالي: if getattr(myObj, '__iter__', False): print("myObj is iterable") بالطبع يمكن عمل دالة isiterable لتقوم بتطبيق أي طريقة من الطرق السابقة وترجع قيمة منطقية Boolean
  5. الفكرة الأساسية هي: استخدام خاصية locale في MaterialApp: إذا كانت `locale` خالية ، فسيتم استخدام القيمة المحلية للنظام. نقوم بتحويل الـ root widget إلى Stateful سيؤدي ذلك إلى إعادة البناء بناءً على المكان والاتجاه اللذين نحددهما. نستخدم Scope Model لحفظ اللغة المستخدمه في التطبيق، ونقوم بتغيرها عندما يتطلب الأمر. فلاتر لا يدعم سوى اللغة الإنجليزية بشكل إفتراضي، لذلك سنحتاج إلى إستخدام حزمة مثل flutter_localizations لإضافة الدعم للغات أخرى في MaterialApp بالإضافة إلى حزمة intl لإضافة ترجمات إلى النصوص. dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter intl: intl_translation: cupertino_icons: ^0.1.2 scoped_model: "^0.2.0" dev_dependencies: flutter_test: sdk: flutter نقوم بإحاطة التطبيق بـ scope model لحفظ / تغيير اللغة الحالية، وفصل الواجهة عن الكود المنطقي، ليسهل التعديل وصيانة التطبيق فيما بعد. ونقوم بعمل دالة changeDirection لتغير اللغة وإتجاه النص import 'package:flutter/material.dart'; import 'package:scoped_example/my_app.dart'; import 'package:scoped_model/scoped_model.dart'; class ScopeModelWrapper extends StatelessWidget { @override Widget build(BuildContext context) { return ScopedModel<AppModel>(model: AppModel(), child: MyApp()); } } class AppModel extends Model { Locale _appLocale = Locale('ar'); Locale get appLocal => _appLocale ?? Locale("ar"); void changeDirection() { if (_appLocale == Locale("ar")) { _appLocale = Locale("en"); } else { _appLocale = Locale("ar"); } notifyListeners(); } } نقوم بإضافة الخاصية locale إلى MaterialApp في النهاية يمكن أن تضيف الدالة model.changeDirection(); إلى الخاصية onPressed ليتم تغير اللغة من الإنجليزية إلى العربية والعكس. يمكنك أيضًا أن تقوم بتعديل الأكواد السابقة لتقبل الدالة changeDirection مدخل باسم اللغة "ar" أو "en" أو "fr" .. إلخ ويمكنك الإطلاع على كود بسيط ومفتوح المصدر لتغير اللغة في صفحة تسجيل دخول من هذا المستودع.
  6. تقدم بايثون عدة طرق للوصول إلى متغيرات البيئة: إستخدام مكتبة os كالتالي: import os print(os.environ['USERPROFILE']) # Output: C:\Users\sameh ولعرض كل متغيرات البيئة يمكنك طباعة القائمة بالكامل كالتالي: print(os.environ) كما يمكنك أن تستعمل التابع get للحصول على قيمة متغير بيئة معين، وفي حالة عدم وجودة سوف يتنم إعادة None بدلًا من إطلاق خطأ KeyError: print(os.environ.get('NOT_EXISTS')) # None يمكنك أن تستعمل الدالة getenv من مكتبة os للحصول على قيمة متغير بيئة أيضًا كالتالي: import os print(os.getenv('KEY_EXIST', default_value)) في حالة عدم وجود متغير البيئة سوف يتم إعادة القيمة الإفتراضية default_value وللتحقق من وجود متغير بيئة معين يمكنك أن تستخدم المعامل in كالتالي: 'USERPROFILE' in os.environ # True or False
  7. في الجزء الأول من الكود: $(document).ready(function () { droopy(); $('.preloader-it > .la-anim-1').addClass('la-animate'); }); يتم إنتظار تحميل الصفحة بالكامل من خلال التابع ready في مكتبة jQuery، ثم يتم البحث عن عنصر ما من خلال المحدد .preloader-it > .la-anim-1 ويتم إضافة الصنف la-animate له، بالنسبة للدالة droopy فيبدو أنها دالة خاصة موجودة في جزء آخر من الكود أو في ملف جافاسركيبت آخر، لذلك لا يمكنني معرفة ما تفعله بالضبط. أما في الجزء الثاني من الكود: $(window).on("load", function () { // ... }); هنا يتم إنتظار تحميل الصفحة بالكامل (متضمنه الصور والـ frame .. إلخ). بعد ذلك يتم إنتظار نصف ثانية (500 ms) ثم يتم إخفاء العنصر .preloader-it ببطئ $(".preloader-it").delay(500).fadeOut("slow"); بعد ذلك يتم تخزين كل العناصر التي لديها الصنف .progress-anim في متغير progressAnim، ويتم التأكد من وجود عنصر واحد على الأقل من خلال جملة if var progressAnim = $('.progress-anim'); if (progressAnim.length > 0) { // ... } ثم يتم المرور على كل عنصر من العناصر التي تم تخزينها في الخطوة السابقة ويتم إستخدام مكتبة waypoints ليتم تنفيذ دالة عندما يظهر كل عنصر من هذه العناصر على الشاشة for (var i = 0; i < progressAnim.length; i++) { // ... } وما تقوم به هذه الدالة هو البحث عن كل العناصر التي يمكن الوصول إلها عبر المحدد .progress-anim .progress-bar ويتم تغير عرض width كل عنصر من هذه العناصر بالقيمة الموجودة في الخاصية aria-valuenow $this.waypoint(function () { var progressBar = $(".progress-anim .progress-bar"); for (var i = 0; i < progressBar.length; i++) { $this = $(progressBar[i]); $this.css("width", $this.attr("aria-valuenow") + "%"); } }, { triggerOnce: true, offset: 'bottom-in-view' }); يمكنك معرفة المزيد عن مكتبة waypoints من خلال توثيقها الرسمي من هنا.
  8. تحتاجين إلى تسريع وقت تحميل صفحتك، يمكن للملاحظات التالية أن تساعدكِ في هذا الأمر: ملفات CSS: حاولي تجنب وجود عدد كبير من ملفات CSS. كلما زاد عدد الملفات يعني زيادة عدد طلبات HTTP. تجنبي استخدام "import@" في ملفات CSS الخاصة بك بدلًا من ذلك استخدمي إستدعاء الخطوط من خلال HTML يمكنك تصغير ملفات CSS الخاصة بك. باستخدام أداة تصغير عبر الإنترنت مثل CSS minifier أو باستخدام عدة مكتبات برمجيًا. قمي بتحميل تنسيقات CSS الخاصة بكِ <link> في الجزء العلوي من ملف HTML وليس في نهاية عنصر head. ملفات JS: أنقلي كل ملفات js إلى أسفل ملف HTML، أي قبل نهاية العنصر body مباشرة يمكنك تصغير ملفات js الخاصة بك. باستخدام أداة تصغير عبر الإنترنت مثل JavaScript-minifier أو باستخدام عدة مكتبات برمجيًا. الملاحظات السابقة تساعد في تقليل الوقت اللازم لتحميل الصفحة وخصوصًا ملفات CSS، فكلما تم تحميل ملفات CSS بشكل أسرع كلما ظهرت التنسيقات على العناصر بشكل أسرع.
  9. يمكنك أن تستخدم التابع random لتكوين مصفوفة أحادية من أرقام عشوائية كالتالي: import numpy as np a = np.array([ [1, 2,], [3, 4] ]) x = np.random.rand(a.shape[0], 1) # array([[0.40956956], [0.45251438]]) يمكنك بعد ذلك إستخدام التابع append لدمج المصفوفتين في مصفوفة واحدة كالتالي: b = np.append(a, x, axis=1) """ Output: array([[1. , 2. , 0.99125393], [3. , 4. , 0.33360925]]) """
  10. ليس مهمًا نوع الحسوب طالما يحتوي على المقومات المطلوبة للبرمجة، والتي ليست بالشيء الكثير في الوقت الحالي، فيمكن إستخدام أي جهاز كمبيوتر تم إنتاجه خلال العشرة أعوام السابقة بدون أدنى مشكلة لمعظم مجالات البرمجة (مثل تصميم المواقع الإلكترونية وتطبيقات سطح المكتب)، كما أنه ليس من المهم إن كان الجهاز هو ماك من أبل أو كان حسوب يستعمل ويندوز كنظام تشغيل. يجدر العلم أن هناك بعض المجالات في البرمجة تحتاج متطلبات معينة لكي تعمل كصناعة الألعاب على سبيل المثال، لذلك يجب تحديد المجال في البداية أيضًا.
  11. يمكنك أن تستعمل خدمة خرائط جوجل للحصول على الموقع الحالي للمستخدم (خطوط الطول ودوائر العرض)، وإن كنت تريد أن تستخدم خدمات تحديد المواقع في موقع إلكتروني أو تطبيق يستعمل HTML5 فأنصحك بالإطلاع على هذه المقالة من الأكاديمية: تحديد الموقع الجغرافي (GeoLocation) في HTML5 كما أن إطار العمل React Native و كوردوفا يدعمان خدمات الموقع الجغرافي GeoLocation، ويمكنك الإطلاع على توثيق كل من هما باللغة العربية من مووسوعة حسوب من هنا: Geolocation في React Native إضافة تحديد الموقع الجغرافي في كوردوفا بالنسبة لدورات حسوب فيمكنك الإطلاع على الأسعار من خلال صفحة الدورات التعليمية من هنا
  12. كما ذكرت في الإجابة الأولى، يجب أن تكون خاصية name لها نفس القيمة في كلا الحقلين، بعد ذلك يمكنك الحصول عليها من خلال المتغير $request كالتالي: // نفس قيمة الخاصية name 👇 if ($request->defaultExampleRadios == "male") { // male } else { // female } بهذه الطريقة سوف تكون قيمة defaultExampleRadios هي قيمة الخاصية value في العنصر الذي قام المستخدم بعمل check عليه. يمكنك الحصول على معلومات أكثر من خلال موسوعة حسوب من هنا
  13. يمكنك الحصول عليها بشكل مباشر كالتالي: if ($request->gender == "male") { // do something }
  14. هل تقصد معرفة قيمة الحقل من خلال JavaScript؟ إن كان كذلك فيمكنك الحصول على القيمة من خلال الكود التالي: male = document.querySelector('#defaultUnchecked').checked # False female = document.querySelector('#defaultChecked').checked # True أما إن كنت تقصد كيفية الحصول على القيمة من خلال الواجهة الخلفية بإستخدام PHP على سبيل المثال، فيمكنك ذلك من خلال جعل قيمة الخاصية name واحدة وتعين خاصية value بقيمة (male أو female) وما سيتم إرساله هو القيمة المحددة فقط، كالتالي: <div class="form-group row"> <!-- Default unchecked --> <div class="custom-control custom-radio"> <input type="radio" class="custom-control-input" id="defaultUnchecked" name="gender" value="male"> <label class="custom-control-label" for="defaultUnchecked">male</label> </div> <!-- Default checked --> <div class="custom-control custom-radio ml-5"> <input type="radio" class="custom-control-input" id="defaultChecked" name="gender" value="female" checked> <label class="custom-control-label" for="defaultChecked">female</label> </div> </div> لاحظ قمت بإضافة name بنفس القيمة و value لكل حقل بقيمة مختلفة، وعند إرسال النموذج إلى الخادم سيحصل الخادم على قيمة gender بـ female (لأن female هي المحددة checked إلا إذا قام المستخدم بتحديد male )
  15. يوجد أكثر من حل لهذه المشكلة، وهم كالتالي: تميرير --user عند تنفيذ أمر التثبيت كالتالي: pip install --user -r requirements.txt عمل بيئة عمل إفتراضية من خلال إستخدام أداة مثل virtualenv كالتالي: virtualenv .venv source .venv/bin/activate pip install -r requirements.txt إستخدام sudo عند تنفيذ أمر التثبيت كالتالي: sudo pip install -r requirements.txt لكن هذا الأمر الأخير خطير ولا ينصح بإستخدامه في أي حال من الأحوال، وذلك لوجود إحتمال بإحتواء بعض المكتبات على أكواد ضارة، وإذا قمت بتثبيت هذه المكتبات من خلال sudo قد تتمكن هذه الأكواد الضارة من الحصول على أذونات المستخدم الجذر root وسيكون بإمكانها فعل ما تشاء في الحسوب.
  16. يمكنك إستخدام الأمر التالي لإيقاف كل نسخ Node taskkill /f /im node.exe الأمر السابق سوف يقوم بإنهاء كل العمليات التي تسمى node.exe ، والعلم /f يستخدم لإجبار كل العمليات على التوقف وهو إختياري فقط. أما إن كنت تريد إيقاف عملية node server يعمل على منفذ معين مثل 8000 فيمكنك أن تقوم بعرض كل العمليات التي تستمع إلى هذا المنفذ من خلال الأمر التالي: netstat -ano | find "LISTENING" | find "8000" بعد ذلك سوف تظهر كل العمليات التي تستخدم هذا المنفذ مع معرف العملية process ID والذي يمكنك أن تستخدمه لإيقاف عملية معينة من خلال الأمر التالي: taskkill /pid <معرف العملية> taskkill /pid 14828
  17. تحدث هذه المشكلة بسبب عدم إستخدام الإتصال بالخادم لمدة أكثر من 10 دقائق، ويمكن حل المشكلة من خلال تمرير المدخل no_cursor_timeout بقيمة True كالتالي: cursor = collection.find({ "$and" : [{ "users" : { "$gt" : 2000 } }, { "users" : { "$lt" : 3000 } }, { "is_like" : { "$exists" : False } }] }, no_cursor_timeout=True) for i in cursor: pass cursor.close() # إنهاء الإتصال لاحظ أنه يجب عليك إنهاء الإتصال بنفسك لكي تتجنب إستهلاك الموارد
  18. يبدو أنك تستخدم Mongodb بالفعل على المنفذ 27017 ، لديك حلين للتخلص من هذه المشكلة: إيقاف mongodb التي تعمل بالفعل من خلال الأمر التالي: sudo killall mongod يقوم الأمر السابق بإيقاف كل عمليات mongodb التي تعمل في الخلفية تغير منفذ التشغيل port من خلال الأمر التالي: mongod --port 27018
  19. جملة with تستعمل للتعامل مع المصادر غير المدارة unmanaged resources مثل فتح الملفات أو إنشاء إتصالات الإنترنت، ويمكن إستعامل جملة with مع أي كائن لديه التابعان __enter__ و __exit__ حيث يتم إستعمال هذه التوابع لفتح الملف على سبيل المثال وإغلاقه، وتكتب جملة with بالشكل التالي: with expression [as variable]: with-block لاحظ أن جزئية as في المثال السابق تستخدم لتخزين الإتصال في متغير من إختيارنا لكي نستطيع الكتابة أو القراءة من الملفات بإستخدام هذا المتغير كالتالي: with open("example.txt", "w", encoding="utf-8") as f: f.write('hello, world!\n') لاحظ أنه تمت الإشاره إلى الملف بإستخدام المتغير f والذي تم إستعماله مع التابع write لكتابة نص في الملف. من مميزات جملة with أنها تغلق الإتصال مباشرة بعد إنتهاء الكود الذي بداخلها، ففي المثال السابق سوف يتم كتابة النص "Hello, world!" وبعدها سيتم إغلاق الملف بشكل مباشر، ولهذا يتم إستعمال with (لضمان أن الإتصال سوف يتم إغلاقه). أما في حالة إستعمال طرق أخرى غير with فسوف يكون عليك أن تقوم بإغلاق الملفات بنفسك.
  20. إن لم يكن لديك نظام تسجيل دخول authentication system فالأمر ليس سهلًا لتحقيق هذا الأمر، هنا بعض الطرق التي يمكنك أن تستخدمها: يمكنك أن ترسل Cookie إلى المستخدم تحتوي على معرف خاص وفريد لكل مستخدم، لكن يمكن أن يقوم المستخدم بحذف / تعديل هذه الـ Cookie يمكنك أن تستخدم IP الخاص بالمستخدم، لكن يمكن للمستخدم أن يستعمل VPN أو Proxy أو حتى يقوم بإعادة تشغيل الموجه router لديه (إن كان يستعمل dynamic ip). يمكنك أن تستعمل ما يسمى بـ browser fingerprinting لكن هذا الأمر يمكن تخطيه بمجرد إستعمال متصفح مختلف. ربما تفكر في إستخدام Mac Address خاص بالمستخدم، لكن للآسف لا يمكن للغة PHP أو لغة JavaScript أن الوصول إلى Mac Address الخاص بالمستخدمين، لذلك هذه الطريقة لن تجدي نفعًا. يمكنك أن تستعمل Cookie خاصة بتقنية flash، لكن هذه التقنية لم تعد مدعومة، هذا بالإضافة إلى وجود إحتمال كبير في أن المستخدم ليس لديه برنامج Flash مثبت في الأساس. كما تلاحظ في الأعلى أن كل طريقة لها مشكلة أو طريقة تمكن المستخدم من تخطيها، وهذه المشكلة تواجهة شركات الإعلان الكبيرة مثل Google AdSense و Microsoft advertising .. إلخ، وحاليًا تستخدم الكثير من الشركات طريقة المعرف المركب أي أن يتم جمع معلومات كثيرة جدًا مثل نوع المتصفح وإصداره وكل إمكانيات الجهاز (مساحة الذاكرة العشوائية ومعلومات المعالج و اللغة الإفتراضية للنظام) و User-Agent و الدولة والمدينة وغيرها الكثير من الخصائص، ثم يتم دمج كل هذه الخصائص مع بعضها البعض لعمل معرف خاص بالمستخدم، ويكون إحتمال أن تتابطق كل هذه الخصائص مع جهاز آخر قليلة (مازال هناك إحتمال حدوث هذا الأمر وارد)، هذا بالإضافة لتطبيق الخصائص الأخرى يف القائمة السابقة أيضًا. يمكنك معرفة ما يمكن الحصول عليه من خصائص ومعلومات عن المستخدم من خلال موقع deviceinfo. توجد شركات متخصصة في تحديد وتتبع المستخدمين مثل موقع device atlas لكن هذه المواقع لديها خطط بأسعار عالية نوعًا ما كما أنها لا تضمن 100% من إمكانية تحديد أو تتبع المستخدم. لاحظ أن حتى المواقع الضخمة مثل YouTube و Vimeo تحتسب المشاهدات أكثر من مرة إن قام المستخدم بتشغيل الفيديو من أكثر من متصفح على نفس الجهاز. أما الحل المثال هو عمل نظام لتسجيل دخول authentication system ومن خلاله يمكنك أن تعطي المستخدمين صلاحيات معينة وتمنعهم من خصائص أخرى، ويمكن إستخدام هذا النظام لإحتساب عدد المشاهدات بسهولة وقد تم شرح هذا الأمر في الإجابة السابقة.
  21. يمكنك عمل ذلك بطريقة بسيطة وهي حذف مجلد node_modules ثم تثبيت جميع الحزم مرة أخرى من خلال الأمر التالي: npm i أو يمكنك أن تقوم بتنفيذ الأمر التالي لحذف جميع الحزم غير المدرجة في الملف package.json: npm prune يقوم هذا الأمر بحذف جميع الحزم من نوع extraneous وأنا أقتبس من توثيق NPM هنا:
  22. يمكنك أن تستخدم هذا الأمر: mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})' يقوم هذا الأمر بطلب من mongo أن تقوم بتنفيذ تعليمة جافاسكريبت (لاحظ العلم --eval)، وستقوم هذه التعليمة بالمرور على كل قواعد البيانات من خلال حلقة forEach وحذف كل قاعدة بيانات على حدى. يمكنك أيضًا أن تقوم بعمل ملف جافاسكريبت وتقوم بإضافة كود جافاسكريبت السابقة إليه، وبعد ذلك تستطيع حذف كل قواعد البيانات من خلال تشغيله فقط: mongo filename.js
  23. يمكنك أن تقوم بإضافة الأرقام إلى المتغير mac_addresses، أما إن كنت تريد توليد عدد كبير من أرقام Mac Address بدلًا من إستخدام أرقام موجودة لديك مسبقًا، فيمكنك عمل دالة تقوم بذلك كالتالي: import random def genrate_mac_addresses(max = 1): addresses = [] for _ in range(max): address = {} address['mac'] = "02:00:00:%02x:%02x:%02x" % (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) address['comment'] = "LAN4" addresses.append(address) return addresses print(genrate_mac_addresses(10)) """ Output: [ {'mac': '02:00:00:23:80:cb', 'comment': 'LAN4'}, {'mac': '02:00:00:2b:fc:16', 'comment': 'LAN4'}, {'mac': '02:00:00:1d:f5:84', 'comment': 'LAN4'}, {'mac': '02:00:00:67:62:1b', 'comment': 'LAN4'}, {'mac': '02:00:00:1f:25:01', 'comment': 'LAN4'}, {'mac': '02:00:00:56:36:b8', 'comment': 'LAN4'}, {'mac': '02:00:00:bd:56:4e', 'comment': 'LAN4'}, {'mac': '02:00:00:8c:f9:24', 'comment': 'LAN4'}, {'mac': '02:00:00:c7:1f:c8', 'comment': 'LAN4'}, {'mac': '02:00:00:b4:7f:77', 'comment': 'LAN4'} ] """ بالطبع يمكنك تعديل بنيه النص المستخدم لتوليد أرقام Mac Address معينة أو حتى تغير الـ comment وتبديله بمدخل إلى الدالة.
  24. يمكن أيضًا أن تستعمل regular expression للحصول على قائمة الأرقام كالتالي: >>> import re >>> string = "01234567890123456789" >>> matches = re.finditer(r'(?=(\d{10}))', string) >>> results = [int(match.group(1)) for match in matches] >>> results [123456789, 1234567890, 2345678901, 3456789012, 4567890123, 5678901234, 6789012345, 7890123456, 8901234567, 9012345678, 123456789] لاحظ أن رقم 10 في السطر الثالث يعبر عن طول سلسلة الأرقام
  25. يحدث الخطأ الأخير بسبب إختلاف في إصدارات الحزم المطلوبة، وحزمة laravel/sanctum تحتاج إلى Laravel الإصدار 6 أو أعلى والذي يمكنك التحديث إليه عبر الخطوات التالية: أولًا يجب التأكد من أن لديك PHP الإصدار 7.2 أو أعلى ثانيًا يجب تحديث الحزم الموجودة في ملف composer.json كالتالي: "laravel/framework": "^6.0", "laravel/passport": "^9.3.2 " ثم نقوم بتنفيذ الأوامر التالية: composer install composer dump-autoload composer update ثم يجب إضافة حزمة laravel/helpers من خلال الأوامر التالية: composer require laravel/helpers php artisan view:clear ملاحظة الخطوات السابقة تعمل للتحديث إلى Laravel الإصدار 6، ويمكن إتباع خطوات مشابهه للتحديث إلى الإصدار 7 أو إلى الإصدار 8
×
×
  • أضف...