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

Sam Ahw

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

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

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

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

    16

إجابات الأسئلة

  1. إجابة Sam Ahw سؤال في ظهور الخطأ Error: EACCES: permission denied في node.js كانت الإجابة المقبولة   
    يجب عليك تغيير صلاحيات الوصول إلى المجلّد، أولاً يجب التأكد من المستخدم المالك owner المجلد:
    ls -la /usr/local/lib/node_modules وغالباً في حال يتم رفض الوصول إلى المجلّد هذا يعني أن المالك هو root، وللتأكد من المستخدم الحالي يمكنك تنفيذ:
    whoami //أو id -un ثم يمكنك تغيير المالك owner من خلال تنفيذ الأمر:
    sudo chown -R [owner]:[owner] /usr/local/lib/node_modules أو sudo chown -R ownerName: /usr/local/lib/node_modules كما ينصح البعض أيضاً بإجراء هذه التعديلات على كل من المجلدات التالية في حال استمرار المشكلة:
    sudo chown -R $USER /usr/local/lib/node_modules/ sudo chown -R $USER /usr/local/bin/ sudo chown -R $USER /usr/local/share/  
  2. إجابة Sam Ahw سؤال في إجراء اتصال بأكثر من قاعدة بيانات mongodb في mongoose كانت الإجابة المقبولة   
    بما أن الأقسام منفصلة عن بعضها وتتشارك نوعاً ما ببنية الكود من الممكن حدوث تضارب كبير في حال تم تجميع كل الـ schema لجميع قواعد البيانات التي لديك ضمن مكان واحد، وبذلك سيصبح المشروع معقّد جداً ولن تستطيع تمييز الخطأ عند حدوثه، لذلك في حال كان كل قسم يحوي مكتباته الخاصة أي ملف (package.json) يمكنك تحميل mongoose في هذه الأقسام بشكل منفصل والتعامل مع الاتصال وبنية schema لكل قاعدة بيانات على حدى.
    وبالتالي يمكنك إنشاء module خاص بالاتصال ضمن كل قسم كالتالي (وليكن ملف اتصال القسم الأول sub_project1_connect.js):
    var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/sub_project1'); module.exports = exports = mongoose; وهكذا لبقية الأقسام، ثم نقوم بإنشاء ملف واجهة interface لهذه الاتصالات بحيث يقوم بتجميعها لسهولة الوصول إليها لاحقاً:
    var mongoose = require("./sub_project1_connect.js"); الآن يمكنك في أي مكان في الكود وضمن أي قسم من تضمين ملف الاتصال الموافق لقاعدة البيانات التي ترغب بالتعامل معها وسيتم بشكل تلقائي إنشاء نسخة mongoose من ذلك الاتصال وبالتالي تحصل على بنية أفضل للملفات وسهولة أكبر في التعامل المباشرة مع قواعد البيانات و ال schema الموجودة لديك.
    أما في حال رغبت باستخدام التابع createConnection فيجب عليك عندها إنشاء model خاص بكل اتصال بالشكل التالي:
    var first_con = mongoose.createConnection('mongodb://localhost/sub_project1'); var second_con = mongoose.createConnection('mongodb://localhost/sub_project2'); // قاعدة البيانات الأولى var Model_project1 = first_con.model('Model', new mongoose.Schema({ .... })); // قاعدة البيانات الثانية var Model_project2 = second_con.model('Model', new mongoose.Schema({ ... }));  
  3. إجابة Sam Ahw سؤال في كيف أقوم بإلغاء ميّزة جمع الاسم (إضافة s) إلى اسم المجموعة في mongodb mongoose كانت الإجابة المقبولة   
    بدءً من النسخة الخامسة من mongoose، أصبح بالإمكان تعطيل هذه الخاصية بشكل كامل عن كل المجموعات التي يتم إنشائها من خلال إضافة السطر التالي بعد إجراء الاتصال:
    mongoose.pluralize(null); وعندها لن تحتاج إلى إعادة تسمية كل مجموعة على حدى.
  4. إجابة Sam Ahw سؤال في اختلاف النتيجة أثناء الحصول على المستندات المتداخلة في mongodb كانت الإجابة المقبولة   
    المشكلة هي أن الاستعلام الأول يقوم بإلبحث عن المستندات التي لها الحقل message يحوي الخاصية from مع قيمة الشرط فقط، أي يجب ألا يحوي هذا المستند أي خصائص أخرى داخل message سوى from.
    أما في الاستعلام الثاني:
    يتم النظر فقط إلى قيمة 'message.from' ولا تتأثر النتيجة بأي حقول أخرى موجودة ضمن الغرض message أو أي حقول أخرى موجودة في المستند الرئيسي
    لذلك سيتم إعادة نتائج مختلفة عند تطبيق كل منهما وفي حال عدم وجود أي مستند يحوي فقط خاصية واحدة from ضمن الغرض message ستكون النتيجة فارغة في الاستعلام الأول
  5. إجابة Sam Ahw سؤال في مشكلة في الاتصال مع قاعدة البيانات failed to connect to server في mongodb كانت الإجابة المقبولة   
    بدءً من الإصدار 5.7.1 يجب إضافة القيمة التالية إلى المعامل الثاني عند إنشاء الاتصال:
    useUnifiedTopology: true فيصبح كود الاتصال لديك بالشكل التالي:
    MongoClient.connect(myURL, { useNewUrlParser: true }, (err, db) => { if (err) throw err; console.log('connected successfully to the database'); db.close(); }); فقد تظهر رسائل تحذيرية عند الاتصال حسب النسخة التي تقوم باستخدامها، لذلك يمكنك إضافة إحدى هذه القيم عند ظهور رسالة تحذيرية عن إحداها:
    { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }  
  6. إجابة Sam Ahw سؤال في ظهور خطأ NonExistentPath بعد تحميل mongodb كانت الإجابة المقبولة   
    يجب أن يتم إنشاء هذا المسار في حال لم يكن موجود في جذر المجلّد وليس ضمن أي مجلّد فرعي آخر. مع التأكد من وجود الصلاحيات اللازمة للمستخدم الذي يقوم بتنفيذ الأمر.
    أحياناً قد يتطلب الأمر الإشارة إلى مسار ملف config من خلال تنفيذ الأمر التالي:
    mongod -f c:\path\to\mongod.conf أو:
    mongod --config c:\path\to\mongod.conf مع استبدال path/to/mongod.conf بالمسار الكامل لمكان وجود الملف mongod.conf
  7. إجابة Sam Ahw سؤال في كيف أطبق pagination باستخدام mongoose في mongodb كانت الإجابة المقبولة   
    يمكن إجراء ذلك بعدة طرق، يختلف تطبيق كل طريقة حسب حجم البيانات والأداء الذي ترغب بالحصول عليه في تطبيقك فبعض الطرق قد تكون أسرع من غيرها، ولكن المبدأ هو بإلتحكم بخصائص الاستعلام التالية: count - limit - skip، مثال باستخدام  skip و limit:
    find({},{fields to show},{ skip: 10, limit: 5 }, function(err, results) { ... }); حيث يمكنك تمرير قيم متغيرة لكل من skip وهي عدد السجلات التي سيتم إهمالها استعادة السجلات التي تبدأ بعد هذا الرقم، و limit وهو العدد الإجمالي للسجلات التي سيتم استعادتها.
    مثال آخر:
    var perPage = 10 , page = Math.max(0, req.params.page) mymodel.find() .limit(perPage) .skip(perPage * page) .exec(function(err, data) { mymodel.count().exec(function(err, count) { res.render('data', { mydata: data, page: page, pages: count / perPage }) }) }) وبهذه الطريقة ستتمكن من إرسال معلومات عن العدد الإجمالي للصفحات الموجودة وعدد السجلات في كل صفحة والتي تساعد في إظهار أرقام الصفحات في واجهة المستخدم
  8. إجابة Sam Ahw سؤال في ظهور الخطأ duplicate key error في mongodb كانت الإجابة المقبولة   
    بسبب وجود القيد unique على قيمة حقل البريد الالكتروني، تظهر الرسالة بسبب وجود أكثر من مستند له بريد الكتروني فارغ null. فبما أن الحقل مطلوب required وأيضاً فريد، لا يجوز تشابه قيمة هذا الحقل مع مستندات أخرى حتى لو كانت null.
    حسب التوثيق الرسمي، عند وجود حقل له الخاصية unique وعند عدم إضافة أي قيمة لهذا الحقل يتم حفظ قيمة index له وهي null. والباني الخاص بـ index لهذه المجموعة سيفشل ويعيد الخطأ الذي تمت إعادته في حالتك.
    لذلك يمكنك إضافة مايدعى بـ sparse index أو المفتاح المتناثر لتطبيق فلتر على القيم الفارغة null، وعدم التسبب في ظهور هذا الخطأ.
    تطبيق المفتاح index على هذه الحقول وإعطائه القيمة unique يكون بالشكل التالي:
    users.createIndex( { "info.email": 1 }, { unique: true } ) أما لتطبيق خاصية sparse index فهي بالشكل التالي:
    users.createIndex( { "info.email": 1 }, { sparse: true } ) وعندها يستطيع sparse index التعامل مع عدة قيم null ولن يحصل الخطأ السابق.
  9. إجابة Sam Ahw سؤال في كيف أحصل على اسماء الحقول في مستند mongodb كانت الإجابة المقبولة   
    يمكنك من خلال mongodb نفسها دون الحاجة لاستخدام لغات البرمجة من إجراء تجميع للقيم aggregation وإظهار اسماء الحقول لمستند واحد ضمن مصفوفة بتنفيذ الاستعلام التالي:
    aggregate([ {"$match":{_id: "نضع هنا رقم أي مستند"}}, {"$project":{"fieldNames":{"$objectToArray":"$$ROOT"}}}, {"$project":{"keys":"$fieldNames.k"}} ]) أما في حال أردت استعادة جميع اسماء الحقول لكافة المستندات دون تكرارها، يمكنك تنفيذ التالي:
    aggregate([ {"$project":{"fieldNames":{"$objectToArray":"$$ROOT"}}}, {"$unwind":"$fieldNames"}, {"$group":{"_id":null,"allkeys":{"$addToSet":"$fieldNames.k"}}} ])  
  10. إجابة Sam Ahw سؤال في حذف حقل فرعي من مستند في mongodb كانت الإجابة المقبولة   
    يجب عليك التأكد من استخدام التابع unset$ بشكل صحيح بإضافة رقم (1) للدلالة على الحقل بدلاً من كتابة اسم الحقل بشكل منفرد، ولحذف هذه الحقول من جميع المستندات نقوم بوضع شرط فارغ للاستعلام { } مع التأكد من إضافة الخاصية multi وإعطائها القيمة true:
    update({}, {$unset: {ips:1}} , {multi: true}); في حال لم تعمل الطريقة السابقة، يمكنك أيضاً الوصول إلى الحقل الفرعي من خلال المسارات (استخدام النقطة . ) عن طريق ذكر اسم الحقل الأساسي ثم وضع علامة النقطة ثم الحقل الفرعي، وبهذه الطريقة تستطيع الوصول لأي حقل فرعي مهما بلغ العمق. بالشكل التالي:
    update( {}, { $unset: {'attributes.ips':1}}, false, true )  
  11. إجابة Sam Ahw سؤال في مشكلة عدم إجراء توثيق أثناء الدخول إلى mongodb كانت الإجابة المقبولة   
    بعد إضافة المستخدم إلى جدول admin، يجب إعادة إجراء الاتصال مع إضافة الخيار: --auth، ولكن يتم اتباع الخطوات التالية بالترتيب لضمان تطبيق التحقق بالشكل الصحيح:
    أولاً، يتم الاتصال ب mongodb دون الحاجة ل access control، من خلال الأمر التالي (مع استبدال المسار والقاعدة):
    mongod --path /data/db ثانياً، الاتصال من خلال تنفيذ: mongo
    ثالثاً، إضافة مستخدم جديد كمدير، كما يمكنك تحديد صلاحيات محددة على قواعد بيانات بالتفصيل:
    use dbname db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "readWrite", db: "dbname" }, { role: "read", db: "another_db" } ] } ) رابعاً، إيقاف الاتصال الحالي، وإعادة تشغيله من خلال الأمر التالي (مع استبدال المسار أيضاً بالمسار الخاص بك):
    mongod --auth --path /data/db والآن عند تغيير القاعدة يمكنك تحديد أي مستخدم سيقوم بتنفيذ العمليات من خلال الأمر auth:
    use dbname db.auth("admin", "admin") ولتفعيل خاصية التحقق بالشكل افتراضي، يجب إزالة التعليق من السطر:
    #auth=true الموجود في الملف mongo.conf ضمن المسار: /etc/mongod.conf في مكان تنصيب mongo
  12. إجابة Sam Ahw سؤال في تعديل حقل محدّد اعتماداً على حقل آخر في mongodb كانت الإجابة المقبولة   
    يمكن إجراء ذلك باستخدام الدالة concat كما في التعليق السابق، وفي حال كنت ترغب بتعديل المجموعة كاملة أي تعديل كافة المستندات الموجودة ضمن المجموعة عن طريق دمج الاسم، يمكنك إضافة الخاصية multi إلى التابع update بهذا الشكل:
    update( {}, [{ $set: { fullname: { $concat: [ "$firstname", " ", "$lastname" ] } } }], { multi: true } ) أما لإجراء الدمج على مستند محدد، يمكنك إضافة شرط للاستعلام من خلال الخصائص الموجودة (الاسم، الرقم المعرّف،...) وإزالة multi ليتم تطبيق التعديل على مستند واحد فقط.
     
  13. إجابة Sam Ahw سؤال في مشكلة في الحصول على قيمة محددة من مصفوفة في mongodb كانت الإجابة المقبولة   
    يتم تطبيق selection في mongodb بدءً من طبقة المستندات.
    لذلك عندما نقوم بكتابة الاستعلام {"balls.color": "red"} سيتم إعادة (المستند) الذي يحقق هذا الشرط كاملاً دون تطبيق أي شروط أو فلتر على المصفوفات ضمنه. أما في حالتك فأنت ترغب أيضاً بإجراء فلتر على عناصر المصفوفة ضمن هذا المستند الذي سيتم إرجاعه. ويمكن في هذه الحالة استخدام elemMatch والذي سيعيد أول عنصر محقق لهذا الشرط فقط:
    find({"balls.color": "red"}, {_id: 0, balls: {$elemMatch: {color: "red"}}}); وفي حال كانت النسخة لديك أقدم من 2.2 فلن تستطيع استخدام elemMatch، يمكنك بشكل مشابه استخدام projection مع المعامل $ كالتالي:
    find({"balls.color": "red"}, {_id: 0, 'color.$': 1});  
  14. إجابة Sam Ahw سؤال في الاستعلام حسب عدد عناصر المصفوفة في mongodb كانت الإجابة المقبولة   
    بدءً من الإصدار 4.4 أصبح يجب تمرير قيمة رقمية عند استخدام gt$، ولا يمكنك في الإصدارات اللاحقة استخدام gt$ مع size$. لذلك يجب عليك التأكد من إصدار mongodb لديك قبل كتابة الاستعلام.
    ومن بعض الطرق التي تعمل على الإصدارات المختلفة:
    عن طريق استخدام where:
    find( { $where: "this.employees.length > 5" } ); عن طريق استخدام التجميع aggregation:
    aggregate( [ {$project: {_id: 1, employees:1, depts:1, total_employees: {$size: "$employees"} } }, {$match: {"total_employees": {$gt: 5}}} ]) عن طريق استخدام المسارات:
    find({'employees.5': {$exists: true}}) وبهذه الطريقة نختبر وجود العنصر السادس من كل مصفوفة ونعيد المستندات التي تحوي عدد أكبر من 5
     
  15. إجابة Sam Ahw سؤال في الاستعلام عن جزء من النص في mongodb كانت الإجابة المقبولة   
    تتيح mongodb استخدام التعابير النمطية (Regular Expressions) أو regex في الاستعلامات، والتي تعطي مرونة أكثر في التعامل مع السلاسل النصية لأنها تمكنك من استخدام أي نموذج وتطبيقه ضمن الاستعلام مهما بلغ تعقيده.
    يمكنك إجراء الاستعلام باستخدام التعابير النمطية  regex  عن طريق إحاطة الشرط بالعلامة (  / ) كالتالي:
    db.books.find({"book_title": /.*m.*/}) أو بشكل مختصر عن القيم /. :
    db.books.find({"book_title": /m/}) أو:
    db.books.find({'book_title': {'$regex': /m/}}) كما يمكنك التحكّم في حالة الأحرف الصغيرة والكبيرة ضمن هذه الاستعلامات النمطية من خلال إضافة options إلى الاستعلام وإعطائه القيمة ( i ) للتخلي عن التحقق من حالة الحروف ( case insensitive ):
    db.books.find({book_title:{'$regex' : /m/, '$options' : 'i'}}) حيث تمثّل القيمة (.*) نفس عمل ( % ) في sql. ويمكنك تطبيق أي نموذج آخر صالح ضمن regex مثل (. + * $ /d /w /S.... إلخ) على استعلامات mongodb بهذه الطريقة من خلال إحاطته بالعلامة ( / )
  16. إجابة Sam Ahw سؤال في كيف الحصول على اللغة التي يستخدمها المستخدم على المتصفح كانت الإجابة المقبولة   
    يمكنك الحصول على اللغة من خلال الجافاسكريبت، ولكن لا يوجد طريقة موحّدة مدعومة من قبل كافة المتصفحات لجلب هذه المعلومات فكل متصفّح له خصائصه، ولكن مثلاً يمكنك الحصول على المعلومات التالية وهي مدعومة من قبل أغلب نسخ المتصفحات الحديثة الحالية مثل IE, Chrome, Firefox,...:
    navigator.browserLanguage: browser language لغة المتصفح navigator.systemLanguage: Windows system language لغة نظام التشغيل navigator.userLanguage: Windows user-specific language لغة مخصصة من قبل المستخدم ولكن يجب عليك تحديد المتصفّح المستهدف أو نظام تشغيل محدد ومن ثم ماهي لغة البرمجة أو التقنية التي ترغب من خلالها بالحصول على هذه المعلومات.
    فالجافاسكريبت ومتصفحات الويب ستختلف عن تطبيقات الهاتف في حال كان هدفك هو الحصول على اللغة ضمن أجهزة الهاتف.
  17. إجابة Sam Ahw سؤال في لماذا يتم إضافة backslash في نص بلغة بايثون؟ كانت الإجابة المقبولة   
    إن backslash محجوزة في بايثون وتستخدم لإجراء escape من بعض الإشارات المميزة في السلاسل النصية مثل إضافة سطر جديد (\n) أو مسافة (\t)،... إلخ.
    وعند كتابة خط مائل واحد، يقوم Python lexical analyser بدلاً من إظهار خطأ بإضافة خط مائل آخر للنص لتجنّب هذا الخطأ في السلسلة النصية. ولكن لايتم إضافتها فعلياً لقيمة المتغيّر وإنما يتم إظهارها بهذا الشكل فقط في البيئة، أما إذا قمت بالطباعة فسيتم معالجتها بشكل مختلف.
    فإذا أردت إضافة backslash ضمن السلسلة النصية لديك يجب أن تقوم بكتابة خط مائل آخر backslash فتصبح بصورة مزدوجة كالتالي:
    x = "hello, \\world" وفي الطباعة print("\\") أو print "\\"  
  18. إجابة Sam Ahw سؤال في كيف اجعل المستخدم يتحكم بحجم الصورة في المتصفح؟ كانت الإجابة المقبولة   
    يمكن تنفيذ ذلك بعدّة طرق حسب بنية الصفحة لديك وإطار العمل الذي تقوم باستخدامه في كل من الجافاسكريبت و CSS، على سبيل المثال يمكنك إضافة الخاصية resizable الموجودة في jQuery كالتالي:
    $(function() { $( "img" ).resizable(); }); وربطها مع عنصر الصورة مع وضع التنسيقات اللازمة له، مثل تحديد عرض وارتفاع محددين
    <img id="resizable" src="your_image_src" height=200px width=200px> كما يمكنك تحديد عرض وطول أعظمي من خلال CSS لعدم تجاوزهم من قبل المستخدم أثناء التعديل.
    وأيضاً يوجد حل آخر باستخدام CSS3 ولكنه غير مدعوم من قبل جميع المتصفحات:
    img { resize: both; overflow: auto; } وطبعاً يوجد حلول أخرى في أطر العمل المختلفة ومكاتب إضافية لتنفيذ ذلك.
  19. إجابة Sam Ahw سؤال في ظهر لي الخطا التالي Cannot read property 'filename' of undefined كانت الإجابة المقبولة   
    يمكننا مساعدتك بشكل أفضل عندما تذكر تفاصيل أكثر مثل كتابة الكود الذي استخدمته لرفع الصور وأيضاً ماهي المكتبة التي تقوم باستخدامها لمعالجة ذلك وأخيراً الجزء الخاص بتحديد الملفات من واجهة المستخدم.
    فبما أن رسالة الخطأ هي Cannot read property 'filename' of undefined هذا يعني أنه لا يتم التعرّف على الملف الذي قام المستخدم برفعه ويعود ذلك لعدة أسباب وسأذكر لك بعض النقاط التي قد تساعدك في حل المشكلة:
    أولاً: يجب عليك التأكد من أنه يتم تحميل الملف وإرساله مع اسم المتغير الصحيح من واجهة المستخدم وتستطيع ذلك من خلال مراقبة المتغيّرات التي يتم إرسالها بالطلب POST من أدوات تطوير المتصفّح لديك أو من خلال استخدام postman.
    ثانياً: يجب عليك التأكد من أن نوع الترميز الخاص بالـ Form الذي تقوم بإرساله من نوع multipart/form-data:
    <form method="post" enctype="multipart/form-data" action="/upload"> .... </form> ثالثاً: وبفرض أنك تستخدم المكتبة multer للتعامل مع الملفات في Node JS، يجب عليك التأكد من استخدامها بشكل صحيح كوسيط middleware قبل استقبال القيم إلى المتحكّم الخاص بذلك، وتستطيع الاطلاع عن كيفية تحقيق ذلك من خلال التوثيق لهذه المكتبة أو أي مكتبة تقوم باستخدامها في مشروعك لتحميل الملفات. لأن كل مكتبة لها طريقة تضمين والتعامل معها مختلف.
  20. إجابة Sam Ahw سؤال في ظهور خطأ The payload is invalid في لارافل كانت الإجابة المقبولة   
    وفقاً للتوثيق الرسمي في لارافل، إن جميع القيم المشفرة في لارافل يتم تشفيرها من خلال مايعرف بـ MAC - message authentication code. ولذلك لا يمكن تغيير التشفير لقيمة تم تشفيرها مسبقاً من خلال مشروع آخر.
    أي بمعنى آخر، قد تحدث المشكلة نتيجة لتغيير المفتاح في المشروع، ويتم ذلك عادة عند نقل المشاريع أو نسخ الأكواد بين مشروع وآخر، وبالتالي يتغيّر App Key في مشروع لارافيل وعند التعامل مع البيانات المخزّنة مسبقاً في قاعدة البيانات والتي تم تشفيرها من خلال مشروع آخر تحدث هذه المشكلة لأنه لا يمكن لقيمة App key الجديدة من فك تشفير البيانات السابقة والتي تم حفظها بشكل مشفّر مسبقاً من خلال المفتاح السابق.
    مما قد يؤدي أيضاً في حالتك لتشفير بعض البيانات في القاعدة بمفتاح وبيانات أخرى بمفتاح آخر وهي التي في حالتك تظهر فيها هذه المشكلة عدى عن الأخرى.
    لذلك يجب التأكد من قيمة App Key عند نقل المشاريع التي يتم التعامل فيها مع نفس البيانات على خوادم قواعد البيانات.
    ومن إحدى المشاكل التي قد تطرأ أيضاً اختلاف أنماط تخزين كلمة المرور بين قاعدة بيانات وأخرى بين نسخ لارافل من النمط varchar(191) والتي بدورها لا تستطيع تخزين كامل القيمة المشفرة لكلمة المرور بل يتم تخزين جزء منها فقط. لذلك ينصح أيضاً عند التعامل مع مشاريع مختلفة أو نسخ مختلفة تحويل حقل كلمة المرور إلى النمط longtext أو text وخاصةً عندما تكون كلمات المرور غير محددة الطول.
     
  21. إجابة Sam Ahw سؤال في طريقة تحميل الملفات excel في لارافل من خلال axios كانت الإجابة المقبولة   
    لقد نسيت تحديد نوع الرد response الخاص بالملف (responseType) من نمط blob. ولذلك قد يظهر الملف بشكل معطوب أو لا يتم تحميله نهائياً.
    لحل المشكلة يمكن تعديل الكود لديك وإضافة التالي:
    const options = { method: 'POST', responseType: 'blob', <=== ضرورية عند التعامل مع الملفات data: formData, url: '/your_api_link', }; return myAPI.request(options);  
  22. إجابة Sam Ahw سؤال في برمجه العاب الاطفال كانت الإجابة المقبولة   
    بما أن اللعبة ستكون موجهة لتطبيقات الموبايل، فيمكنك البدء بلغات البرمجة التي يتم استخدامها لتطوير الألعاب على الموبايل ومنها Unity بحيث يمكنك من خلال Unity ولأنها cross-platform برمجة الألعاب ونشرها على كامل المنصات أو نظم التشغيل دون الحاجة لإعادة برمجتها لكل جهاز على حدى.
    ولكن لتنفيذ هذا النوع من الألعاب لا يوجد أدوات خاصة أو تقنيات مخصصة لهذا النمط فقط. يجب عليك تفصيل اللعبة من وجهة نظر المبرمج وعندها ستتبسط الأمور لديك وتستطيعين إنجاز كل جزء على حدى. ويمكنك البدء بتعلّم تحريك الأغراض، التحكم بالإحداثيات، إضافة الأغراض،...إلخ. وعندها سيتم تجميع هذه المهارات لبناء أي لعبة مهما كان الهدف منها.
  23. إجابة Sam Ahw سؤال في إعتماد الشهادة في المملكلة العربية السعودية كانت الإجابة المقبولة   
    إن شهادة حسوب معتمدة من قبل الأكاديمية ويمكن التحقق منها ومن وثوقيتها بأي وقت من خلال الكود الموجود فيها. أما بالنسبة للجهات الأخرى والدول فأنت هنا تحصل على شهادة من أكاديمية الكترونية وليس من جامعة حتى تكون الشهادة معتمدة تبعاً لأنظمة التعليم المختلفة في هذه الدول. وهذا هو الحال بالنسبة لأي شهادة دورات على الانترنت.
    ولكن كونك لن تحصل على الشهادة إلا بعد اجتياز اختبار مقدّم من الأكاديمية فهذا يعطيها أفضلية عن الشهادات الأخرى. وعموماً معظم الشركات لن تنظر فقط إلى الشهادة بغض النظر عن من قام بإصدارها وخصوصاً في البرمجة لأنه تبقى مهاراتك والخبرة التي لديك هي الإثبات الوحيد.
    لمزيد من المعلومات حول الشهادة والاختبار يمكنك التواصل أيضاً مع فريق الدعم (من هنا) في حال كان لديك أي سؤال أو استفسار بهذا الخصوص.
  24. إجابة Sam Ahw سؤال في طلب اكثر من String في وقت واحد لدى URL في flutter كانت الإجابة المقبولة   
    يمكنك الفصل بين المتغيّرات في رابط http عن طريق استخدام الرمز &
    بحيث يسبق أول متغيّر فقط رمز إشارة الاستفهام ؟ وبعدها في حال وجود متغيّرات أخرى يجب أن تضع قبل كل متغيّر الرمز &
    مثال:
    http://test.com/?id=123&name=anyname&vriable=vkkllk فيصبح مثالك بالشكل التالي:
    https://**********/list.php?id=' + widget.id.toString()+ '&state=' + widget.state.toString();  
  25. إجابة Sam Ahw سؤال في هل إضافة عدد كبير من المكتبات يؤثر على أداء التطبيق java كانت الإجابة المقبولة   
    إن عدد المكتبات له تأثير على أداء المشروع ولكن لا يتم احتسابها بهذه الطريقة، فعند ربط مكتبة معيّنة أنت تقوم باستخدام صفوف من هذه المكتبة وبالتالي ليس بالضرورة تحميل كامل المكتبة واستخدامها في JVM.
    وإن العدد الكبير للمكتبات يمكن أن يؤثر على المشروع ولكن بفوارق بسيطة وحسب عدّة متغيرات منها الشيفرة المصدرية للمكتبة وأدائها بشكل مستقل وأيضاً في المشاريع الكبيرة والتي تعتمد على عدد كبير من المكتبات يتم اختبار تنفيذ عملية ما على عدة مكاتب والتي بدورها توفر نفس الوظيفة ليتم بعدها اختيار المكتبة الأنسب للمشروع والتي تنفّذ المطلوب بأداء أفضل.
    ولكن معظم المكاتب المعتمدة من قبل الجافا هي مكاتب تم اختبارها لتحقق أفضل أداء وفعالية عند استخدامها في المشاريع ولذلك قد لا تؤثر على مشروعك بشكل ملحوظ وخاصة عند استخدام صفوف معيّنة منها.
    مثال على ذلك، إن استخدام التالي:
    import java.util.*; يختلف عن استخدام صف معيّن:
    import java.util.Set; وبالمجمل قد تؤثر على أداء compiler ولكن ليس لها تأثير ملحوظ كما ذكرت سابقاً على أداء البرنامج أثناء التشغيل run-time
×
×
  • أضف...