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

كل الأنشطة

تحدث تلقائيًا

  1. الساعة الماضية
  2. ما سبب تلك المساحة، هل قمت بعدم تضمين ملف node_modules من خلال ملف .gitignore حيث لا يتم رفعه إلى مستودع GitHub، فبه الحزم المثبتة بالمشروع، لذا عند تحميل شخص آخر لمشروعك يقوم بتحميلها من خلال ملف package.json من خلال أمر npm install
  3. اليوم
  4. أحاول رفع مشروع Electron إلى github قمت بعمل gitignore ولكن المشروع باقي أكبر من 100mb فقمت بتحميل git lfs وقمت بي الخطوات المذكوره في الصفحه الرسميه المشكله أنه عند عمل push يظهر الخطأ التالي error: Authentication error: Authentication required: You must have push access to verify locks عند حذف git lfs تذهب المشكله لكن المشروع كبير فتبقى المشكله بحثت عن حل لكن لم أجد حل مناسب في قوقل شكرا على المساعده
  5. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم الأسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  6. السلام عليكم ، وجرت العديد من الأكواد لاستخراج البيانات من الويب ، لقد خزنت selenium , chromedriver عن طريق pip وطرق أخرى عديدة مع تأكدي من أن الاصدار يوافق المتصفح ، لكن دائما تظهر لي رسالة ( المكتبة غير موجودة ) , جرب ذلك في أكثر من لغة برمجة ( الأمر ليس له علاقة بالكود ) لا أدري أين تكمن المشكلة شكرا لتعاونكم
  7. طيب كيف يعملونها بأي لغة وكيف ابغا اجرب الاذونات وكيف يصنعونها وهل هي الطريقه معقده
  8. وعليكم السلام. لندرس المثال جيدا، انظر عندما تفتح رابطا مختصرا من موقع مثل abdo.com ويتم تحويلك أولا إلى رابط يحتوي على google.com قبل أن يتم توجيهك إلى موقع الهبوط النهائي، فهذا غالبا يكون جزءا من تقنية لجعل الزيارة تظهر كأنها من Google. هذا يمكن أن يتم بطرق مختلفة مثل استخدام إطارات iframe التي تضمن رابط Google في صفحة وسيطة، أو بتغيير قيمة الـ HTTP referrer باستخدام جافا سكريبت لكن أحيانا تستخدم تقنية meta refresh لتحويل الزائر من خلال صفحة تحتوي على الرابط المطلوب بطريقة تغير مصدر الزيارة فهذه الطرق قد تكون فعالة لتحويل مصدر الزيارات لكن يجب استخدامها بحذر لتجنب المشاكل القانونية أو الانتهاكات لسياسات الخصوصية. يمكنك الاطلاع أكثر من خلال هذه المقالة:
  9. في الحقيقة، عندما نمنح تطبيقا أو موقع ويب إذنا للوصول إلى الصور أو الميكروفون أو الكاميرا على الجهاز، فيجب أن يستخدم هذه الإمكانيات فقط أثناء استخدامنا للتطبيق أو الموقع. أما بعد إغلاق التطبيق أو الموقع، فلا ينبغي لهم أن يكونوا قادرين على الوصول إلى هذه الوظائف ما لم نكن قد منحناهم صلاحيات التشغيل في الخلفية. فتلك الصلاحيات لا تقتصر فقط على الشركات الكبيرة؛ لأنه يمكن لأي مطور برمجيات أن يطلب هذه الصلاحيات ضمن تطبيقه إذا كان ذلك ضروريا لوظائف التطبيق فلا بد من استخدام هذه الصلاحيات وفقا لسياسات الخصوصية التي يعلن عنها المطورون والتي يجب أن تحترم قوانين حماية البيانات المعمول بها في البلدان التي يتم فيها تقديم الخدمة. عادة يمكنك تفادي الأذونات غير المرغوب فيها ببساطة من خلال اتخاذ الخطوات التالية: قراءة وفهم الأذونات المطلوبة قبل تحميل التطبيق أو الدخول إلى الموقع. استخدام إعدادات الخصوصية والأمان في جهازك للتحكم في الصلاحيات التي يمكن للتطبيقات الوصول إليها. تحديث البرامج وأنظمة التشغيل لديك للاستفادة من أحدث إجراءات الأمان. استخدام تطبيقات الأمان التي توفر حماية إضافية وتتيح لك مراقبة الأذونات التي تستخدمها التطبيقات.
  10. الخطأ الذي ظهر في الصورة التي قدمتها يعود إلى أن الدالة `range(len(students))` تولد قيم من 0 إلى عدد الطلاب الذي يزيد عن عدد الأوقات المتاحة في قائمة `appointment_times`. بما أن عدد الأوقات هو 4 فقط، ولكنك تحاول الوصول إلى فهرس في القائمة يتجاوز هذا العدد، فإنه ينتج عن ذلك خطأ `IndexError: list index out of range`. هذا الخطأ يحدث عندما يكون عدد الطلاب أكبر من عدد الأوقات المتوفرة في `appointment_times` وتحاول الوصول إلى فهرس غير موجود في قائمة الأوقات. لنحل هذه المشكلة، يجب التأكد من عدم تجاوز الدورة لعدد الأوقات المتاحة، أو كما في المثال التالي الذي يضمن توزيع الطلاب بطريقة تضمن عدم حدوث هذا التجاوز: students = ['جاسم', 'خلف', 'عبدالله', 'زيد', 'ممدوح'] appointment_times = ['9:00', '9:30', '10:00', '10:30'] # طباعة المواعيد لأول ثلاث طلاب for i in range(min(3, len(students))): # يضمن هذا عدم تجاوز القائمة إذا كان عدد الطلاب أقل من 3 print(f"{students[i]} بالساعة {appointment_times[i]}") # توزيع الطلاب الباقين على الموعد الأخير for i in range(3, len(students)): print(f"{students[i]} بالساعة {appointment_times[-1]}") هذا الكود سيضمن توزيع الطلاب الثلاثة الأوائل على المواعيد الثلاثة الأولى، والطلاب الباقين جميعا على الموعد الأخير (10:30)، وهذه الطريقة تعمل حتى لو كان عدد الطلاب أقل من ثلاثة.
  11. توجد عدة خطوات يجب أن تحترمها للوصول لرفع المشروع بالشكل الذي ترغب به الشركة، أول خطوة هي أن تقوم بتحضير السيرفر على لينيكس من خلال تثبيت Python والمتطلبات الأساسية: sudo apt update sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl خاصة بما أنك تعمل على قاعدة بيانات PostgreSQL فالأمر يوضح ذلك. ثاني خطوة هي تثبيت البيئة الافتراضية، يمكنك ذلك من خلال فتح الطرفية وتنفيذ الأمر: sudo pip3 install virtualenv mkdir ~/myproject cd ~/myproject virtualenv myprojectenv source myprojectenv/bin/activate ثم ثم بتثبيت Django و Gunicorn و psycopg2: pip install django gunicorn psycopg2 تهيئة Postgres ضرورية في هذه الحالة: `sudo -u postgres psql` `CREATE DATABASE myproject;` `CREATE USER myuser WITH PASSWORD 'password';` `ALTER ROLE myuser SET client_encoding TO 'utf8';` `ALTER ROLE myuser SET default_transaction_isolation TO 'read committed';` `ALTER ROLE myuser SET timezone TO 'UTC';` `GRANT ALL PRIVILEGES ON DATABASE myproject TO myuser;` `\q` يمكنك متابعة الخطوات والشروحات من خلال هذه المقالة:
  12. ستجد في وصف الدورة التالي: وصول مدى الحياة لمحتويات الدورة تحديثات مستمرة على الدورة تحصل عليها مجانًا بالمستقبل نصائح مخصّصة لك وإرشاد بعد الدورة ضمان استرداد استثمارك خلال 6 أشهر شهادة معتمدة من أكاديمية حسوب لذا تلك من ضمن بنود الدورة التي اشتركت على أساسها، وستجد تفصيل هنا بخصوص ذلك:
  13. الخطأ بسبب تجاوز حدود المصفوفة كما ترا المصفوفة الاولى يختلف حجمها عن الثانية لذلك انته لهذه المشكلة ولحل المشكلة يمكن تخزين اول ثلاث طلاب في حال كانت المصفوفة مرتبة حسب الافضل students = ['جاسم', 'خلف', 'عبدلله', 'مسعود', 'زايد', 'مصطفى'] appointment_times = ['9:00', '9:30', '10:00', '10:30'] first_3_students = students[:3] first_3_appointment_times= appointment_times[:3] تسمى هذه العملية بSlicing اي اقتطاع اول 3 عناصر هنا من مصفوفة الطلاب بعدها يمكن المرور على المصفوفتات المتشابهتان بالحجم بالطريقة التالية for i in range(first_3_students): print(f"{first_3_students[i]} وقته {first_3_appointment_times[i]}") ولباقي الطلاب rest_students = students[3:] for i in range(rest_students): print(f"{first_3_students[i]} وقته {appointment_times[-1]}") الخرج : لكن ليكون الكود اكثر احترافية يمكن استعمال الدالة zip لتمشي على المصفوفتان سويا وتاخذ الطول الاقصر دون ان تعطي خطأ وبعدها يمكن المرور على باقي الطلاب واعطائهم اخر قيمة students = ['جاسم', 'خلف', 'عبدلله', 'مسعود', 'زايد', 'مصطفى'] appointment_times = ['9:00', '9:30', '10:00', '10:30'] first_3_students = students[:3] unique_appointments = {student: time for student, time in zip(first_3_students, appointment_times)} shared_appointment_time = appointment_times[-1] shared_appointments = {student: shared_appointment_time for student in students[3:]} all_appointments = {**unique_appointments, **shared_appointments} for student, time in all_appointments.items(): print(f"{student} وقته {time}") حيث العملية التالية هي وضعهم ضمن قاموس (dictionary) لنتيجة الطلاب الاوائل والطلاب الباقين على التوالي {student: shared_appointment_time for student in students[3:]} {student: shared_appointment_time for student in students[3:]} ثم دمج القاموسين عن طريق التعليمة التالية {**unique_appointments, **shared_appointments} ويكون الخرج مشابه كالاتي وفيما يلي الشكل dictionary التي تتكون من مفتاح عبارة عن الاسم والقيمة هي الوقت الخاص فيه
  14. السلام عليكم انا مشترك بدورة الذكاء الاصطناعي، سؤالي هو هل مضمون انني ساجد عمل بعد انهاء الدورة بنجاح وهل اكادمية حاسوب ستساعدني على ايجاد عمل يغطي قيمة الدورة فهي ليست رخيصة وشكرا
  15. اشلونكم يا اخوان كيف الحال طيب؟ سويت مشروع جانغو لشركة بقاعدة بيانات PostgreSQL ووصلت لمرحلة الرفع لكن الشركة تريد المشروع بشتغل عند موظفينها بس وعندها سيرفر لينكس اشلون ارفعه بحيث يعمل بشكل دائم عندهم ويقدر موظفين الشركة بس الشابكين عليها يقدرون يوصلونله يا ريت احد يساعدني كيف اسوي خطوة بخطوة عشان اقدر ارفعه بشكل صح وما اتأخر
  16. السلام عليكم عندي مصفوفيتين وحدة بيها مواعيد الجلسات والثانية بيها الطلاب ابغى اوزع اول كم طالب (مثلاً اول 3) ع اوقات لحالهم (لانهم يكونون اعضاء مميزين عندي بالموقع) والثانيين ياخدون نفس الموعد ويكونون مع بعضهم لكن ينطيني هذا الخطأ الخرج اللي اريده: جاسم بالساعة 9:00 خلف بالساعة 9:30 عبدلله بالساعة 10:00 والباقيين ما يهم كم عددهم لكن المهم ياخدون الموعد الاخير عندي بمصفوفة المواعيد 10:30 أتمنى تساعدوني واتشكركم
  17. شرح رائع سأبحث في اللي قلته
  18. لا ترفع المكتبات الى الاستضافة لانها يجب ان تاخذ مسار محدد فالطريقة الاسلم هي انشاء ملف للمكاتب المطلوبة عبر الامر التالي ينفذ في التيرمنال في المسار الخاص بالمشروع pip freeze > requirements.txt # To update your requirements.txt file ينشأ ملف نصي ذو لاحقة txt يخزن داخله جميع المكاتب المطلوبة بهذا الشكل: حيث ينصح العمل مع بيئة افتراضية لضمان عدم جلب مكتبات لا داعي لها حيث ان التعليمة freeze تجلب اسماء المكاتب من البيئة المفعلة وفي حال عدم تفعيل بيئة افتراضية يجلب اسماء المكتبات جميعها من بايثون العامة في النظام وهذا يؤدي لجلب مكاتب قد تكون لا حاجة اليها وهذا يؤثر على المساحة على الاستضافة تصبح محجوزة لملفات مكاتب غير ضرورية وعند الرفع تنفبذ التعليمة في الخادم pip install -r requirements.txt ولمعومات اكثر توجه للجواب سابق يفصل طريقة الرفع على استضافة render https://academy.hsoub.com/questions/28164-رفع-مشروع-جانغو-على-استضافة/?do=findComment&comment=87824
  19. الآن اذا حملت برنامج او دخلت على موقع وطلب مني السماح بدخول الى الصور او المايك او الكامره هل بامكانه بعد ان اعطيه السماح او موافق هل يقدر بعد الخروج من البرنامج او الموقع ان يصل الى الكامره او الصور وكيف يفعلون هذي الاشياء هل الاشياء هذي فقط الي تقدر تسويها الشركات الكبراء وهل اي شخص يقدر يسوي الاشياء هذي وكيف يسونها وكيف اتجنب هذي الصلاحيات
  20. السلام عليكم عندي سوال بشوف في مواقع الاختصار ومواقع رفع الملفات الأجنبية حاجه عايز اعرفها دلوقتي مثلا رابط موقع الاختصار abdo.com لما اختصر رابط بيطلع الرابط المختصر مثلا abdo.com/a5tag لما اجي افتح الرابط بيعمل تحويل من الرابط دا abdo.com/a5tag لرابط اوله google.com بعد كده لرابط موقع الهبوط اللي هو عليه الاعلانات عشان تتخطى الاعلانات بعد كده يرجعك لرابط موقع الاختصار تاني تمام انا بقا سوالي ازاي بيعملوا رابط google.com دا عشان يخلو مصدر الزيارات من جوجل
  21. عند رفع مشروع بايثون على استضافة، هناك أمر لبناءالمشروع Build Command يتم تنفيذه وهو: pip install -r requirements.txt ومن خلاله يتم تثبيت جميع الحزم للازمة للمشروع من خلال ملف requirements.txt، ولا تقوم برفعها مع المشروع بل يتم تثبيتها على الاستضافة. ستجد توضيح مُفصل هنا:
  22. اخي مصطفي ممكن تعمل لي مثال كيفية عمل dashboard تكون علي اليمين بحيث اضغط علي صفحة معينه يرفعنا اليه
  23. لدي مشروع بلغة بايثون أو أي لغة برمجية اخرئ وأقوم باستدعاء المكتبات المطلوبه وتثبيتها في بيئة العمل وعند استكمال المشروع وترتيب ملفات المشروع واريد ارفع ملفات المشروع إلى الاستضافة (الخادم ) السوال المهم هل ارفع المكتبات المطلوبه مع الملفات (السكربت)الى الاستضافة داخل مجلدوستتم إدارتها ومعالجتها بشكل مرتب ومنظم.من قبل الخادم ؟؟ ام كل مكتبه داخل ملف منفصل ؟؟
  24. السلام عليكم احتاج الى شخص يستطيع برمجة روبوت بشري اضافة تطبيق اضافه لغات تعلم الحركة والاوامر والتنقل الروبوت ذكي جدا ومدعوم ai ولكنه خام
  25. تُعد صيغة جافاسكريبت لترميز الكائنات JavaScript Object Notation واختصارًا JSON صيغة نصية لتمثيل البيانات المهيكلة وفقًا للصياغة الكائنية في جافاسكريبت، وهي شائعة الاستخدام لتمثيل وتبادل المعطيات عبر الويب (مثل إرسال البيانات من الخادم إلى العميل لتُعرض على صفحة الويب). ستصادف هذه الصيغة كثيرًا لهذا سنشرح لك في هذا المقال ما تحتاج معرفته عن عمل JSON في جافاسكربت بما في ذلك تفسير صياغتها للوصول إلى البيانات التي تضمها وكتابة بياناتك الخاصة بهذه الصياغة. ننصحك قبل أن تبدأ العمل معنا في هذه السلسلة أن تطلع على: أساسيات HTML. أساسيات عمل CSS أساسيات جافاسكربت كما شرحناها في سلسلة المقالات السابقة. أساسيات البرمجة كائنية التوجه كما شرحناها في مقال أساسيات العمل مع الكائنات في جافا سكريبت. ماهي صيغة JSON؟ JSON هو تنسيق نصي لتمثيل البيانات يتبع الصياغة القواعدية للغة جافا سكريبت، نشره وزاد شعبيته دوغلاس كروكفورد. وعلى الرغم من الشبه الكبير بين هذا التنسيق والصياغة القواعدية لكائنات جافا سكريبت الحرفية، يمكن استخدامه بشكل مستقل عن جافا سكريبت، وتتمتع الكثير من بيئات البرمجة بالقدرة على قراءة (تفسير) البيانات بتنسيق JSON وتوليدها. لتنسيق JSON طبيعة نصية، وهو أمر مفيد لنقل البيانات عبر الشبكات. وتحتاج إلى تحويل تنسيق JSON إلى كائن جافا سكريبت أصلي إن أردت الوصول إلى محتوياته. وبالطبع، لن يكون اﻷمر صعبًا لوجود كائن JSON عام في جافا سكريبت يقدّم توابع للتحويل بين الصيغتين (JSON - كائن جافا سكريبت). ملاحظة: تُدعى عملية تحويل كائن إلى نص بغية إرساله عبر شبكة بالسَلسَلة serialization، وعملية تحويل سلسلة نصية إلى كائن أصلي إلغاء السَلسَلة deserialization. يمكن تخزين نص JSON في ملف خاص، وسيكون على شكل ملف نصي نمطي يحمل اللاحقة json.، وله نمط MIME التالي: application/json. هيكلية JSON قلنا سابقًا أن نص JSON هو سلسلة نصية منسقة بطريقة تحاكي كائن جافا سكريبت حرفي. وباﻹمكان إضافة نفس اﻷنواع اﻷساسية للبيانات ضمن تنسيق JSON كما تفعل تمامًا عند التعامل مع كائن جافا سكريبت، مثل النصوص واﻷرقام والمصفوفات والقيم المنطقية وكائنات حرفية أخرى. يتيح لك هذا التنسيق بناء البيانات بشكل هرمي كالتالي: { "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": true, "members": [ { "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] }, { "name": "Eternal Flame", "age": 1000000, "secretIdentity": "Unknown", "powers": [ "Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel" ] } ] } ولو حملّنا النص السابق في برنامج جافا سكريبت وفسرناه إلى كائن يدعى superHeroes مثلًا، سنتمكن من الوصول إلى البيانات التي يضمها وفق أسلوب الوصول إلى أعضاء الكائنات (نقطة أو قوس مربع). إليك مثالًا: superHeroes.homeTown; superHeroes["active"]; وللوصول إلى بيانات أعمق في التسلسل الهرمي، عليك كتابة سلسلة بأسماء الخاصيات وأدلة المصفوفات وصولًا إلى الخاصية المطلوبة. فلو أردت الوصول إلى القوة الخارقة الثالثة للبطل الخارق الثاني الموجود في قائمة البيانات، عليك تنفيذ ما يلي: superHeroes["members"][1]["powers"][2]; نستخدم اولًا اسم المتغير superHeroes.. ندخل بعدها إلى الخاصية members ضمنه، لهذا نستخدم التعليمة ["members"]. تضم الخاصية members مصفوفة كائنات، وعلينا الوصول إلى الكائن الثاني منها لهذا نستخدم الأمر [1]. وضمن الكائن الثاني من المصفوفة، نريد الوصول إلى الخاصية powers، لهذا نستخدم التعليمة ["powers"]. تضم الخاصية powers مصفوفة تحتوي على القوى الخارقة للأبطال، ونريد من بينها الثالثة [2]. ملاحظة: يمكنك الوصول إلى البيانات السابقة بتنسيق JSON ضمن الملف JSONTest.html (ألق نظرة على الشيفرة المصدرية). جرّب أن تحمّل الملف ثم الوصول إلى البيانات ضمن المتغيّر عبر طرفية جافا سكريبت في متصفحك. المصفوفات وتنسيق JSON أشرنا سابقًا أن نص JSON يبدو مشابهًا لكائن جافا سكريبت ضمن سلسلة نصية. ويمكننا أيضًا تحويل المصفوفات من وإلى تنسيق JSON. إليك مثالًا عن استخدام صحيح لتنسيق JSON: [ { "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] } ] هذه الشيفرة نص JSON صحيح تمامًا، وعليك فقط الوصول إلى أعضاء المصفوفة (في النسخة المفسّرة منه) بأن تبدأ بدليل العنصر الذي تريده من المصفوفة مثل [0]["powers"][0]. ملاحظات أخرى إن JSON هو نص نمطي تنسق فيه البيانات بشكل محدد، ويتضمن خاصيات فقط ولا يضم توابع. لا بد من استخدام علامات اقتباس مزدوجة حول القيم النصية وأسماء الخاصيات، ولا يمكن استخدام علامة الاقتباس المفردة إلا لإحاطة نص JSON بأكمله. ستسبب أية أخطاء في وضع الفواصل أو النقطتين المتعامدتين في ملف JSON بوقوع مشاكل، ولن يعمل عندها الملف. انتبه إلى ضرورة التحقق من أية بيانات تحاول استخدامها (على الرغم من ضآلة احتمال وجود أخطاء في بيانات JSON التي يولدها الحاسوب، إن كان البرنامج الذي يولدها صحيحًا). بإمكانك التحقق من صحة بيانات JSON باستخدام تطبيقات مخصصة لذلك يمكنك البحث عنها في اﻹنترنت. يمكن لملف JSON شكل أي نوع من أنواع البيانات الصالحة للاستخدام في JSON وليست فقط الكائنات والمصفوفات، فسلسلة نصية مفردة أو رقم مفرد هي بيانات JSON صحيحة. على عكس شيفرة جافا سكريبت التي لا تتطلب وضع علامات اقتباس حول الخاصيات، لا بد من إحاطة أسماء الخاصيات في JSON بعلامتي اقتباس مزدوجتين. تطبيق عملي: العمل مع JSON سنعمل في هذا التمرين على استعراض طريقة الاستفادة من بيانات منسقة وفق تنسيق JSON في صفحة ويب. نقطة الانطلاق أنشئ بداية نسخة عن الملفين heroes.html و style.css على حاسوبك. ويتضمن الملف الثاني بعض تنسيقات CSS البسيطة لتنسيق الصفحة، بينما يضم اﻷول شيفرة HTML بسيطة لجسم الصفحة، إضافة إلى العنصر <script> الذي يضم شيفرة جافا سكريبت التي سنكتبها خلال عملنا على هذا التمرين. <header> ... </header> <section> ... </section> <script> ... </script> تتوفر بيانات JSON للتمرين ضمن ملف مخصص على جيت-هب، وسنحمّل هذا الملف باستخدام الشيفرة ونستخدم بعض دوال شجرة DOM لعرض البيانات: دوال المستوى اﻷعلى وهي كالتالي: async function populate() { const requestURL = "https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json"; const request = new Request(requestURL); const response = await fetch(request); const superHeroes = await response.json(); populateHeader(superHeroes); populateHeroes(superHeroes); } نستخدم للحصول على بيانات JSON واجهة برمجية تُدعى Fetch تسمح لنا بإرسال طلبات عبر اﻹنترنت للحصول على موارد من الخادم من خلال جافا سكريبت (مثل الصور والنصوص وملفات JSON وحتى مقتطفات من شيفرة HTML). أي بإمكاننا تحديث جزء صغير من محتوى الصفحة بدلًا من اعادة تحميل الصفحة بالكامل. تستخدم اﻷسطر اﻷربعة اﻷولى من الدالة الواجهة البرمجية Fetch ﻹحضار ملف JSON من الخادم: صرحنا عن المتغير requestURL لتخزين عنوان الملف على جيت-هب. استخدمنا عنوان URL لتهيئة كائن الطلب Request الجديد. أرسلنا طلب عبر اﻹنترنت باستخدام الدالة ()fetch وسيعيد ذلك كائن استجابة Response. نحصل على الاستجابة بتنسيق JSON عن طريق استخدام الدالة ()json العائدة للكائن Response. ملاحظة: الواجهة البرمجية غير متزامنة asynchronous، لهذا لابد من إضافة الكلمة المحجوزة async قبل اسم الدالة التي تستخدم الواجهة والكلمة المحجوزة await قبل استدعاء أية دوال غير متزامنة. بعد كل ذلك، سيضم المتغير superHeroes كان جافا سكريبت المبني وفق بيانات JSON. ثم نمرر بعد ذلك الكائن إلى استدعاء دالتين الأولى لتملأ العنصر <header> بالبيانات الصحيحة، والثانية لتنشئ بطاقة معلومات لكل بطل في الفريق ووضعها ضمن العنصر <section>. ترتيب المعلومات في الترويسة بعد أن حصلنا على البيانات من الخادم وفق تنسيق JSON وحولناها إلى كائن جافا سكريبت، سنستخدمها عن طريق الدالتين اللتين أشرنا إليهما سابقًا. لهذا أضف الشيفرة التالية التي تمثّل تصريحًا عن دالة تحت الشيفرة الموجودة: function populateHeader(obj) { const header = document.querySelector("header"); const myH1 = document.createElement("h1"); myH1.textContent = obj.squadName; header.appendChild(myH1); const myPara = document.createElement("p"); myPara.textContent = `Hometown: ${obj.homeTown} // Formed: ${obj.formed}`; header.appendChild(myPara); } تنشئ الشيفرة السابقة بداية عنصر <h1> باستخدام التابع ()createElement، وأسندنا إلى محتواه قيمة الخاصية squadName التي تعود إلى كائن جافا سكريبت، ثم ألحقنا العنصر ومحتواه بالترويسة مستخدمين التابع ()appendChild. كررنا بعد ذلك نفس الخطوات مع الفقرة النصية، إذ أنشأناها بداية ثم وضعنا فيها المحتوى المناسب وألحقناها بالترويسة. والفرق الوحيد بين الحالتين هو أننا ضبطنا المحتوى النصي للفقرة ليكون مساويًا لقالب مفسّر (أو حرفي) template literal يضم قيمتي الخاصيتين homeTown و formed. إنشاء بطاقة معلومات البطل الخارق أضف اﻵن شيفرة الدالة التي تُنشئ وتعرض بطاقة البطل إلى نهاية الشيفرة السابقة كالتالي: function populateHeroes(obj) { const section = document.querySelector("section"); const heroes = obj.members; for (const hero of heroes) { const myArticle = document.createElement("article"); const myH2 = document.createElement("h2"); const myPara1 = document.createElement("p"); const myPara2 = document.createElement("p"); const myPara3 = document.createElement("p"); const myList = document.createElement("ul"); myH2.textContent = hero.name; myPara1.textContent = `Secret identity: ${hero.secretIdentity}`; myPara2.textContent = `Age: ${hero.age}`; myPara3.textContent = "Superpowers:"; const superPowers = hero.powers; for (const power of superPowers) { const listItem = document.createElement("li"); listItem.textContent = power; myList.appendChild(listItem); } myArticle.appendChild(myH2); myArticle.appendChild(myPara1); myArticle.appendChild(myPara2); myArticle.appendChild(myPara3); myArticle.appendChild(myList); section.appendChild(myArticle); } } بدأنا بتخزين قيمة الخاصية members لكائن جافا سكريبت في متغير جديد. وهذه الخاصية هي مصفوفة تضم عدة كائنات تضم معلومات عن كل بطل. ثم تنقلنا بين كائنات الخاصية باستخدام حلقة for...of لـِ: إنشاء عدة عناصر HTML جديدة وهي: <article> و <h2> وثلاث فقرات نصية <p> و <ul>. ضبط محتوى <h2> ليضم اسم البطل name. ملئ الفقرات النصية الثلاث بقيم الخاصيتين secretIdentity و age وبعبارة "Superpowers" لتقديم المعلومات الموجودة في القائمة. تخزين قيمة الخاصية powers في متغير آخر جديد يُدعى superPowers وتضم الخاصية مصفوفة تضم القوى الخارقة التي يتمتع بها البطل. استخدام حلقة for...of من جديد للتنقل بين القوى التي يمتلكها البطل وإنشاء عنصر <li> لوضع القوة ضمنه ثم نلحق عنصر القائمة listItem بالقائمة غير المرتبة <ul> (التس تُسمى <myList). إلحاق العنصر <h2> والفقرات النصية الثلاث <p> والقائمة <ul> بالعنصر <article> (الذي يُسمى myArticle) وإلحاقه بالعنصر <section>. وانتبه إلى إلحاق العناصر وفق الترتيب السابق تمامًا، فسيعكس ذلك ترتيب الملعومات التي ستُعرض في صفحة HTML. ملاحظة: إن واجهت صعوبة في تنفيذ التمرين، عُد إلى الشيفرة المصدرية له أو اطلع على النسخة الجاهزة منه. ملاحظة: إن واجهت صعوبة في استيعاب استخدام ترميز (النقطة والأقواس المربعة) في الوصول إلى كائنات جافا سكريبت، سيساعدك فتح الملف superheroes.json في نافذة أخرى لمحررك النصي والرجوع إليه عند متابعة شيفرة جافا سكريبت. كما يمكنك العودة إلى مقال أساسيات العمل مع الكائنات في جافا سكريبت لمعلومات أوضح عن طريقة الترميز هذه. استدعاء توابع المستوى اﻷعلى علينا أخيرًا استدعاء الدالة الأعلى مستوى ()populate populate(); التحويل بين الكائنات والنصوص يبدو التمرين السابق بسيطًا من ناحية الوصول إلى كائنات جافا سكريبت، لأننا حولنا الاستجابة التي أرسلها الخادم مباشرة إلى كائن جافا سكريبت باستخدام response.json. لكن في أحيان أخرى، قد تكون الاستجابة سلسلة JSON خام (غير منسّقة)، وعلينا حينها تحويلها إلى كائن جافا سكريبت بأنفسنا. وعندما نريد إرسال كائن جافا سكريبت إلى الخادم عبر اﻹنترنت، لا بد من تحويله إلى تنسيق JSON قبل اﻹرسال. ونظرًا لشيوع الحالتين السابقتين في تطوير الويب، تضم المتصفحات كائن JSON مضمن يمتلك التابعين التاليين: ()parse: يقبل نص JSON كمعامل ويعيد كائن جافا سكريبت الموافق. ()stringify: يقبل كائنًا كمعامل له، ويعيد نص JSON الموافق. بإمكانك رؤية عمل التابع الأول في النسخة الجاهزة من التمرين السابق (انظر أيضًا إلى شيفرته المصدرية) وهو يفعل تمامًا ما تفعله النسخة التي بنيناها باستثناء أننا: حصلنا على الاستجابة على شكل سلسلة نصية بدلًا من تنسيق JSON لاستخدامنا التابع ()text للحصول على الاستجابة. استخدمنا التابع ()parse لتحويل النص إلى كائن جافا سكريبت. إليك مقطع الشيفرة الموافق لما ذكرنا: async function populate() { const requestURL = "https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json"; const request = new Request(requestURL); const response = await fetch(request); const superHeroesText = await response.text(); const superHeroes = JSON.parse(superHeroesText); populateHeader(superHeroes); populateHeroes(superHeroes); } وكما ترى، يعمل التابع ()stringify بطريقة معكوسة. جرّب اﻵن إدخال اﻷسطر التالية إلى طرفية جافا سكريبت في متصفحك سطرًا تلو اﻵخر: let myObj = { name: "Chris", age: 38 }; myObj; let myString = JSON.stringify(myObj); myString; ننشئ هنا كائن جافا سكريبت ثم نتحقق من محتواه ونحوّله بعدها إلى نص JSON باستخدام التابع ()stringify. نخزّن القيمة المعادة في متغيّر جيد ثم نتحقق منه مجددًا. الخلاصة قدمنا في هذا المقال دليلًا بسيطًا لاستخدام تنسيق JSON في برامجك بما في ذلك إنشاء وتفسير نصوص JSON وكيفية الوصول إلى البيانات التي يضمها. ترجمة -وبتصرف- لمقال Working with JSON اقرأ أيضًا تعلم JSON صيغة JSON وتوابعها في جافاسكربت ما عليك معرفته عن حقول JSON في قواعد بيانات MySQL كيفية استخدام صيغة JSON في لغة Go
  26. لأنك تستخدم قاعدة بيانات SQLite عليك تفعيل الإضافات التالية في ملف php.ini: extension=pdo_sqlite extension=sqlite3 ستجد بجانبهم فاصلة ; منقوطة قم بحذفها لتفعيل الإضافة ثم قم بالضغط على CTRL + S للحفظ. وإذا كنت لا تستخدم SQLite في لارافل 11، فقم بتعديل المتغيرات التالية في ملف .env: SESSION_DRIVER=database SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null إلى: SESSION_DRIVER=cookie SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null
  1. عرض المزيد
×
×
  • أضف...