-
المساهمات
1388 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
16
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Sam Ahw
-
يعرف هذا النوع من الثغرات باسم حقن الشيفرة المصدريّة أو Cross-site scripting (XSS)، ويوجد عدة طرق وقائية تستخدم للحماية من هذا النوع من الاختراقات. وجميعها تتمحور حول البيانات التي يتم تمريرها وإدخالها إلى خادم الويب لديك. مثال بسيط: INSERT INTO persons(firstname, lastname) VALUES(REPLACE('<script>alert("Test")</script>', '<script>', ''), 'Sample Value'); وبذلك يحدث هذا الخرق عندما يتم تمرير المدخلات inputs كما هي بشكل مباشر إلى قاعدة البيانات دون التأكد منها. فيجب التأكد من صحة المدخلات في كلا الطرفين (من جهة المستخدم، ومن جهة خادم الويب) من خلال إجراءات التحقق أو validation وأيضاً sanitization لما يقوم المستخدم بتمريره إلى الخادم، وحتى من طرف خادم الويب يجب أيضاً التأكد من صحة هذه المدخلات أنها مناسبة لما سيتم معالجته وخالية من الأكواد البرمجية قبل البدء بمعالجتها أو حفظها في قواعد البيانات. تختلف هذه الآليات باختلاف لغات البرمجة والتقنيات التي تقوم باستخدامها من مشروع لآخر، ولكن يوجد العديد من أطر العمل التي أصبحت تقوم بالحماية من XSS بشكل افتراضي دون أن تقوم بإضافة أكواد خاصة لذلك. مثل إطار العمل لارافل في PHP وما يستخدمه من Eloquent في التعامل مع قواعد البيانات، أو حتى أنظمة التحقق من المدخلات وغيرها الكثير. وفي حال لم تكن تستخدم أي إطار عمل أو أطر عمل لا تدعم الحماية من XSS، يجب عليك البحث عن جميع الاحتمالات الأخرى أو المنافذ التي يمكن للمستخدم إجراء هذا النوع من الاختراقات وتطبيق الحماية اللازمة على خادم الويب لديك.
-
المشكلة ليست في ملف .env طالما قمت بكتابة اسم قاعدة البيانات ومعلومات الاتصال بالشكل الصحيح: DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=hello // DB_name DB_USERNAME=root // DB_username DB_PASSWORD= //DB_password تأكد من أن قاعدة البيانات موجودة بنفس الاسم على الاستضافة ومن اسم المستخدم وكلمة المرور للوصول إليها. أما ماتبقى من ملف .env فهو صحيح ولا يتعلّق بالاتصال بقاعدة البيانات. كما يمكنك تشغيل app debug لإمكانية الحصول على معلومات إضافية عن الأخطاء التي تحدث.
- 4 اجابة
-
- 1
-
الخطأ Server Error 500 هو خطأ عام وقد تؤدي عدة أسباب لذلك لا يمكننا معرفة ماهو السبب بالتحديد من رمز الخطأ. لكن بما أن المشكلة في المسارات التي تتعامل مع قاعدة البيانات، تأكد من الاتصال مع قاعدة البيانات بشكل صحيح ومن أن قاعدة البيانات موجودة على الاستضافة ويمكن جلب معلومات منها. ولنستطيع مساعدتك بشكل أفضل، يجب على الأقل ذكر تفاصيل لغة البرمجة ونوع قاعدة البيانات وأجزاء الكود التي تسبب المشكلة.
-
طبعاً يوجد العديد من الفروقات بين المرشحات الخطية وغير الخطية، ففي المرشحات الخطية سيتغيّر الخرج بشكل خطي مع تغيير بيانات الإدخال وعندها يمكن اسقاطها بشكل خط مستقيم على لتمثيل العلاقة بين الدخل والخرج. أما في حالة المرشحات الغير خطية ستكون العلاقة غير خطية بين الدخل والخرج وعند اسقاطها على الرسم سنجد عدم تأثر خرج الترشيح في حال قمنا بتعديل قيمة المرشح الغير خطي. ولكن لاختيار طريقة الترشيح يجب أولاً تحديد الغاية من استخدامها حيث لكل منها ميزات إيجابية وسلبية بما في ذلك الاستيفاء وتقليل الضوضاء وإعادة التشكيل حسب البيانات التي يتم التعامل معها. وغالبًا ما يتم تحديد اختيار طريقة التصفية أو الترشيح حسب طبيعة المهمة ونوع وسلوك البيانات حيث تؤثر الضوضاء والنطاق الديناميكي ودقة الألوان والعديد من التفاصيل على نتائج وظائف المرشح في معالجة الصور. ولكن بشكل عام يتم القياس تبعاً لعاملين أساسيين هما إما إزالة الضوضاء - الضجيج (noise) أو ميزة التجريد abstraction. ففي الحالات التي يكون فيها بيانات الإدخال تحوي كمية كبيرة من الضجيج noise ولكن الحجم أو magnitude لهذه البيانات قليل فمن الأفضل استخدام المرشحات الخطية linear وبالأخص من نوع low-pass. أما في حال كانت الصورة تحوي كمية قليلة من الضجيج ولكن حجم magnitude كبير نسبياً، فمن الأفضل استخدام median filter هنا وعادةً ما يتم استخدامها أيضاً عند الحاجة لإزالة الضجيج من نوع pepper and salt. ويجب ملاحظة أنه عند استخدام أي من الأنواع السابقة سيتم تغيير تردد عرض حزمة البيانات ولن تبقى على حالها. لذلك يتم الوصول إلى النتيجة الأمثل من خلال التجريب والقياس.
-
بالنسبة لتطبيقات الويب، نعم يتم استخدام html و css لتصميم واجهات صفحات الويب. ولكن بالنسبة لتطبيقات التلفاز فهي غالباً تستخدم النظام android، وبالتالي يجب عليك التوجه لبرمجة التطبيقات وليس لتصميم واجهات موقع ويب. ومن خلال تطبيق اندرويد يمكنك مخاطبة أي سيرفر خارجي برمجياً وتبادل المعلومات. يمكنك الاطلاع على المزيد من التفاصيل حول لغة البرمجة التي ستقوم باستخدامها والمزايا التي يمكنك إضافتها إلى التطبيق من خلال التوثيق الرسمي لنظام android المقدّم من غوغل من القسم بناء تطبيقات التلفاز (Build TV apps) الذي سيطلعك على آلية بناء واجهات تطبيقات التلفاز وكيفية تشغيلها وبناء الألعاب وجميع التفاصيل الأخرى التي قد تحتاجها لذلك.
-
يوجد العديد من الأسباب لبطء الحاسوب ومنها: استهلاك الذاكرة RAM استهلاك مساحة التخزين HDD or SSD تشغيل العديد من الأوامر والعمليات في الخلفية تشغيل العديد من البرامج أثناء الإقلاع startup وجود بعض الملفات الضارة أو الفيروسات وغيرها... كما يوجد بعض الأسباب المتعلّقة بالعتاد الصلب للحاسوب hardware والتي تسبب أحياناً بطء فيه وارتفاع حرارته، ومنها أداء مروحة التبريد أو وجود أوساخ وغبار على مروحة التبريد أو داخل غطاء الحاسوب. وذلك يحتاج إلى فك الغطاء من قبل مختص وتنظيف بعض الأجزاء داخل حاسوبك. لذلك يجب عليك أولاً تحديد ما السبب وراء بطء الحاسوب لتتمكن من حل المشكلة بالشكل الصحيح. ويمكنك البدء أولاً بالتأكد من أن لديك مساحة تخزين كافية على حاسوبك أو تحتاج لحذف بعض الملفات وتفريغ المساحة. أما للتأكد من أداء عمل RAM و CPU من خلال الضغط على لوحة المفاتيح Alt-Ctrl-Del وفتح مدير المهام task manager والذي يعطيك لمحة شاملة عن أداء كل منهما من خلال النسب المئوية الظاهرة في أعلى الأعمدة، وعندها يمكنك الاطلاع على جميع العمليات التي يتم تنفيذها حالياً والتأكد في حال وجود أي عمليات تستهلك حجم كبير من RAM أو CPU لإيقافها، كما يمكنك التأكد أيضاً من البرامج التي يتم تنفيذها أثناء الإقلاع عبر النافذة startup وتعطيل البرامج الغير مرغوب بها. كما يمكنك البحث على بعض البرامج على الانترنت بعضها مجاني وبعضها الآخر مدفوع والتي تقوم بفحص أداء الحاسوب وتقوم بإزالة الملفات الغير ضرورية أو الضارة من جهازك. وفي حال كانت المشكلة تظهر فقط عند تشغيل برنامج الفوتوشوب، فسبب ذلك هو أن الموارد الموجودة ضمن حاسوبك من ذاكرة عشوائية ومعالج لا تكفي لتشغيل هذا النوع من البرامج ويجب عليك زيادة هذه الموارد.
-
إن ترتيب استخدام الوسطاء middlewares في node.js مهم ويحدث فرق في تنفيذ الكود البرمجي. والوسيط الذي يتم التصريح عنه أولاً سيتم استدعائه أولاً، وفي حال كان بإمكانه استقبال الطلب، لن يتم استدعاء أي وسيط آخر تم تعريفه بعده. وفي الكود لديك، قمت بوضع express.static أولاً، وبالتالي هو من سيقوم باستقبال الطلب. لذلك يجب عليك إعادة ترتيب الكود لديك ليصبح بالشكل التالي: app.use(express.cookieParser()); app.use(function (req, res, next) { var cookie = req.cookies.cookieName; if (cookie === undefined) { var value_random=Math.random().toString(); value_random=value_random.substring(2,value_random.length); res.cookie('cookieName',value_random, { maxAge: 900000, httpOnly: true }); console.log('test cookie created'); } else { console.log('لقد تم تعريفها مسبقاً', cookie); } next(); }); app.use(express.static(__dirname + '/public')); ومع النسخ الحديثة من express تم فصل التعامل مع ملفات تعريف الارتباط، فيمكنك بدلاً من: app.use(express.cookieParser()); يجب عليك تحميل المكتبة بشكل منفصل من خلال: npm i cookie-parser ثم استخدامها بالشكل التالي: const cookieParser = require('cookie-parser'); app.use(cookieParser());
- 3 اجابة
-
- 1
-
MVC هي معمارية وليست تقنية برمجية، وبالتالي اللغات لن تحوي دوال مخصصة لل MVC ودوال أخرى لغير ذلك. أما في سؤالك لقد وضعت HTML، وهي لغة توصيف وليست لغة برمجة ولا تحوي أي دوال أو توابع أو صفوف (كلاسات)، وبالتالي سؤالك فيه سوء فهم إما لل HTML أو للمنهجية MVC. يمكنك وضع الكود الذي تواجه مشكلة فيه وسنساعدك في حل الأخطاء التي قد تواجهها. كما يجب عليك قراءة المزيد عن MVC قبل محاولة تطبيقها لأنه يبدو أن المفهوم غير واضح لك بشكل جيد.
-
URI هو اختصار لـ: معرف المورد الموحد (Uniform Resource Identifier) وهو عبارة عن عنوان فريد يستخدم لتحديد المحتوى على الشبكة مثل مقطع فيديو، صفحة ويب،.. إلخ. ومن أهم الاختلافات بينه وبين URL (Uniform Resource Locator) باختصار هو أن URL بالإضافة لذلك يقوم بتحديد أين يوجد هذا المحتوى بالتحديد وكيفية الوصول إليه ومواصفات بروتوكول الاتصال. فإذاً وبشكل عام كل URL هو جزء من URI. أما بالنسبة لجافا أو أي لغة برمجة أخرى، قد تحتاج للتعامل مع محتويات موجودة على الشبكة، ويسهّل لك الصف URI الموجود في جافا من خلال java.net.URI تحقيق ذلك. وقد ترى الاختلاف من خلال مثال بسيط في جافا باستخدام URL أو URI كالتالي: كما يتيح لك الصف URI استخدام العديد من الخصائص مثل scheme، اسم المستخدم وكلمة المرور، authority التحقق وأيضاً إضافة استعلامات من خلال هذا الرابط نفسه، بحيث يمكنك جمعها كلها في نفس الرابط أو تقسيمها إلى متغيرات منفصلة عن بعضها، مثال: public void createURI() throws Exception { URI example1 = new URI( "scheme://user:password@authority:80" + "/path?query"); URI example2 = new URI( "scheme", "user:password", "authority", 80, "/path", "query"); assertEquals(example1.getScheme(), example2.getScheme()); assertEquals(example1.getPath(), example2.getPath()); } كما يمكنك استخدام بعض التوابع مثل getScheme و getPath وغيرها من التوابع التي يوفرها الصف URI في جافا. أما استخدام URL ضمن جافا فهو مختلف بعض الشيء، مثال: public void createURL() throws Exception { URL ex = new URL( "http://anywebsitehere.com"); URL ex2 = new URL("http", "somehost", 80, "/path/to/file"); assertEquals(ex.getHost(), ex2.getHost()); assertEquals(ex.getPath(), ex2.getPath()); } وأيضاً يمكنك بأي وقت التحويل من URI إلى URL وبالعكس باستخدام التوابع التالية: URL toURL = uri.toURL(); URI toURI = url.toURI();
- 1 جواب
-
- 2
-
إن الوسيط body-parser يقوم فقط بالتعامل مع البيانات من نمط JSON و urlencoded data، ولا يستطيع معالجة البيانات في حال كانت من الشكل multipart على سبيل المثال الفورم الذي يحوي أي صور أو ملفات مع بيانات أخرى. ولكن بدءً من النسخ الحديثة من express أصبح body-parser مبني ضمنياً ضمنه ولا داعي لوضع السطر السابق في الكود الخاص بتعريف خادم الويب لديك. لذلك يمكنك اختصار هذه المرحلة. يمكنك بدلاً من ذلك استخدام التالي: app.use(express.json()); وعندها سيتم التعامل مع النسخة الحديثة من JSON bodies. أما للمسارات المرمزة من خلال الجسم body ضمن الطلب وفي مثالنا الطلبات من نوع Post بنمط HTTP، يمكنك وضع السطر التالي ضمن الكود: app.use(express.urlencoded()) أما في حال كانت الطلبات مقتصرة على postman دون وجود كود برمجي كامل (طرف الخادم + طرف العميل من خلال ajax أو غيرها من التقنيات)، يمكنك تحديد النوع raw ضمن الطلب وإضافة التالي ضمن الخيارات: Content-Type: application/json ثم يمكنك كتابة البيانات المراد تمريرها إلى الخادم مع التأكد من إحاطة اسماء المتغيرات بعلامة تنصيص مزدوجة والمحافظة على هيئة json وإلا لن يتم إرسال الطلب بالشكل الصحيح: { "name": "test" } أما في الحالات التي يتم فيها استخدام بيانات mutlipart، وفي حال كنت تستخدم وسيط مثلاً لرفع الملفات كما هو الحال في multer في node.js، يجب عليك التأكد من تعريف الوسيط وخصائصه بالشكل الصحيح واستخدامه قبل طباعة محتوى الطلب وإلا ستحصل أيضاً على body فارغ حتى لو قمت بتطبيق جميع الطرق السابقة.
-
نحصل على هذه المعلومات وغيرها من خلال الطلب نفسه req الذي يقوم بتفسيره إطار العمل express مما يمكننا من استخدامه بشكل مباشر ضمن الكود. يتم الوصول إلى البروتوكول المستخدم في الاتصال عبر express من خلال: req.protocol أما قبل النسخة الثالثة من express فيكون البروتوكول ثابت دوماً كـ http إلا إذا تم ذكر السطر البرمجي التالي ضمن الكود بالتالي سيكون https: req.get('X-Forwarded-Protocol') أما المضيف host فيمكن الحصول عليه من خلال: req.get('host') وفي حال لم ترغب بتجميع هذه العناصر مع بعضها البعض، يمكنك ببساطة استخدام API الذي يقدمها node.js الخاصة بالمسارات بالشكل التالي: var url = require('url'); function getFullURL(req) { return url.format({ protocol: req.protocol, host: req.get('host'), pathname: req.originalUrl }); } وبعدها يمكنك استدعاء التابع السابق بشكل مباشر عند الحاجة.
-
إن قمت بالبحث ضمن الأكاديمية ستجد العديد من الإجابات على سؤالك بخصوص معمارية MVC فهذه المعمارية هي منهجية برمجية وليست مقتصرة على لغة معينة مثل PHP أو أي لغة أخرى، لذلك لن تتغير الإجابة إذا قمت بتغيير لغة البرمجة فالمبادئ هي نفسها أينما وجدت. فيما يلي بعض الإجابات على سؤالك سابقاً: أما بخصوص التطبيقات العملية، يمكنك أخذ Laravel على سبيل المثال وفهم آلية توزيع مجلداتها وكيفية العمل بين المكونات، فهي مبنية على منهجية MVC وبمجرد قيامك بإنشاء مشروع جديد من خلال لارافل تقوم باعتماد هذه المنهجية وأثناء قيامك بالبرمجة من خلالها تقوم بتطبيق مثال عملي على MVC نظراً لآلية توزيع المكونات في لارافل.
-
يمكنك استخدام Object.bsonsize مع إجراء حلقة تكرارية على المستندات الموجودة ضمن هذه المجموعة بالشكل التالي: let max_size = 0, doc_id = null; db.test.find().forEach(doc => { const size = Object.bsonsize(doc); if(size > max_size) { max = size; doc_id = doc._id; } }); print(doc_id, max_size); وعندها سيتم طباعة الرقم المعرّف وأعلى حجم للمستند الأكبر الموجود ضمن المجموعة لديك. ولكن ذلك بالتأكيد سيكون له تأثير على الأداء في حالة المجموعات التي تحوي أعداد كبيرة من المستندات لأنه سيتم المرور عليها جميعاً وإجراء شرط المقارنة. كما يمكنك إنشاء مصفوفة وترتيبها ثم أخذ قيمة الحجم بالشكل المختصر التالي: db.docs.find().toArray().map(function(doc) { return {size:Object.bsonsize(doc), _id:doc._id}; }).sort(function(a, b) { return a.size-b.size; }).pop(); والتي ستقوم بطباعة النتيجة التالية: { "size" : 3333, "_id" : "docId..." } وبشكل مماثل يمكنك الحصول على الحجم من خلال خاصية التجميع aggregation والتي تعد الطريقة الأمثل للأداء في حال عدد المستندات الكبير: db.docs.aggregate([ { $match: { 'docs.ids': { $exists: true } }}, { $project: { sizeLargestField: { $size: '$docs.ids' } }}, { $sort: { sizeLargestField: -1 }}, ]) والتي ستقوم بترتيب المستندات من الأكبر حجماً إلى الأصغر وبعدها يمكنك أخذ القيمة الأولى من الناتج.
- 3 اجابة
-
- 1
-
يمكنك استخدام التابع getTimestamp مباشرةً على قيمة الحقل _id وبالتالي سيتم استعادة قيمة التاريخ والوقت حسب timestamp الموجود ضمن هذه القيمة: ObjectId.prototype.getTimestamp = function() { return new Date(parseInt(this.toString().slice(0,8), 16)*1000); } وضمن mongo shell يمكنك تنفيذ الكود التالي: var time = document._id.getTimestamp(); وستظهر لك قيمة الوقت بالشكل التالي في حال قمت بطباعتها: Wed Sep 07 2021 18:37:37 GMT+1000 (AUS Eastern Standard Time) // أو حسب الوقت الموجود أما للمقارنة مع وقت محدد من خلال mongoose في الكود لديك، يمكنك وضع الشرط التالي: document._id.getTimestamp() > new Date("2020-12-12") بحيث يتم استخدام الغرض Date الموجود في الجافاسكريبت. مع إمكانية التحكّم بصيغة الوقت حسب المطلوب.
- 3 اجابة
-
- 1
-
يمكن إجراء ذلك من خلال الكود البرمجي عن طريق تنفيذ عمليات الإدخال إلى المجموعة الجديدة ضمن حلقة تكرارية، ويمكنك وضع الشرط المناسب ضمن الاستعلام في هذه الحلقة، مثال مبسّط: find({date:"2020-12-12"}).forEach(function(doc){ db.newColl.insert(doc); }); بحيث يتم إضافة هذه المستندات المحققة للشرط على المجموعة الجديدة newColl. ومن خلال الإصدارات الجديدة ل mongodb أصبح بإمكانك تنفيذ ذلك ضمن shell نفسها من خلال استخدام خاصية التجميع aggregation والمعامل out بالشكل التالي: db.originalCol.aggregate([ { $match: { date: "2020-12-12" } }, { $out: "newCollection" } ])
-
يمكنك استخدام تابع إعادة التسمية rename: const fs = require('fs'); fs.rename(oldPath, newPath, callback) والذي من ضمن خصائصه أنه يمكنك تعريف مسار جديد للملف وعندها سيتم نقل هذا الملف من المسار الموجود فيه إلى المسار الجديد، مثال: var old = '..المسار الحالي للملف/file.txt' var new_path = '..المسار الجديد للملف/file.txt' fs.rename(old, new_path, function (err) { if (err) throw err console.log('success') }) كما يمكنك تحميل واستخدام المكتبة mv، ولكن لا حاجة لأي مكاتب خارجية فهي طريقة بسيطة وسريعة من قبل node.js
- 3 اجابة
-
- 1
-
من الممكن أن تكون المشكلة متعلّقة بال cache ل NPM الموجود لديك، لذلك يمكنك تجربة تنفيذ الأمر التالي أولاً: npm cache verify ثم إعادة تنفيذ أمر التحميل من جديد: npm install والتأكد من إزالة package-lock.json ضمن المشروع كما يمكنك تجربة الأمر التالي: npm cache clean --force وفي حال لم تنفع الأوامر السابقة، في نظام تشغيل ويندوز يمكنك التوجه إلى المسار التالي: Users%username%\AppData\Roaming وإزالة المجلّد npm والمجلّد npm-cache، ثم إعادة تحميل npm من جديد. كما يمكنك البحث عن المشكلة مع نسخة الإصدار لديك على الإصدار الرسمي في github فلقد تمت معالجة المشكلة بأساليب مختلفة حسب النسخة المستخدمة.
- 3 اجابة
-
- 1
-
يمكنك استخدام المتغيرات العامة global variable ضمن نفس الأمر في محرر الأوامر بالشكل التالي: ./mongo --nodb --quiet --eval "var t1=10, t2=20" testfile.js بحيث سيتم تمرير قيم كل من t1,t2 من خلال الملف testfile.js ومن الممكن أيضاً وضع أي قيم ضمن ملف جافاسكريبت منفصل والقيام باستدعائه أولاً: // ضمن الملف vars.js var1 = "test"; ثم يتم الاستدعاء بالشكل التالي: mongo vars.js targetFile.js MongoDB shell version: blah connecting to: ... loading file: vars.js loading file: targetFile.js test
-
بإمكانك تشغيل محرر mongodb shell والذي يمكنك من كتابة الأوامر بشكل مباشر من خلال تنفيذ الأمر التالي مع الحاوية: docker run -it -p 28000:27017 --name mongoContainer mongo:latest mongo أما في حال كان لديك نسخة الحاوية قيد التشغيل، يجب عليك تنفيذ exec معها بالشكل التالي: docker exec -it mongoContainer mongo كما يمكنك استخدام pull mongo وتشغيلها مع حاوية خاصة بتنفيذ سلسلة الأوامر التالية: docker pull mongo docker run --name your_container_name --restart=always -d -p 8080:8080 mongo mongod --auth sudo docker exec -i -t your_container_name bash وبعدها يمكنك الاتصال كالتالي: mongo use admin db.createUser({user:"user", pwd:"password", roles:[{role:"root", db:"admin"}]}) exit && exit الآن يمكنك إجراء أي عمليات على هذه الحاوية من خلال إجراء الاتصال كالتالي: mongo -u "user" -p "password" HOSTIP --authenticationDatabase "admin"
- 3 اجابة
-
- 1
-
من أبسط الطرق التي يمكنك استخدامها هي منع الإضافة أو التحديث في حال وجود القيمة username ضمن المصفوفة: update( {_id: id, 'users.username': {$ne: 'some_value_here'}}, {$push: {users: {'name': 'some_value_here', 'value': 11}}}) بحيث يتم أولاً إجراء استعلام على المستندات التي لا تحوي هذه القيمة ضمن الحقل username وبعدها تتم الإضافة، أما في حال وجود أي مستند يحوي هذه القيمة فلن يتحقق الاستعلام وبالتالي لن تتم الإضافة على المجموعة.
- 1 جواب
-
- 1
-
التكرار أو replication، وهو كما يشير الاسم إلى إنشاء نسخة من البيانات الموجودة والسماح بتحريك هذه النسخة إلى عقد أخرى متصلة مع العقدة الأساسية بين قواعد البيانات، وبالتالي يساعد هذا المفهوم على توسيع نظام قواعد البيانات لديك وتحاشي الأخطاء بإتاحة القدرة دوماً على الوصول إلى البيانات حتى في حال هبوط عقدة ما من بين العقد الموجودة. ولكن يجب الانتباه إلى أن البيانات في هذه الحالة لن تكون بالضرورة هي النسخة الأحدث، ويمكن حصول تأخير في تحديث هذه النسخ تبعاً للإعدادات التي تم تهيئة هذه البيئة بها. (وهو مشابه للمفهوم master/slave والمتعارف عليه في قواعد بيانات mySql وغيرها). أما التجزئة أو sharding: تسمح بتجزئة البيانات التي يتم إدخالها من خلال عمليات الكتابة writes إلى عدد من العقد التي تتشارك فيما بينها بمفتاح shard key. وبالتالي ليس بالضرورة تكرار نفس البيانات بين العقد بل وضع كل جزء من هذه البيانات على عقدة. أي عكس المفهوم السابق والذي يتم فيه تكرار نفس البيانات بين عقد مختلفة. في mogodb تعد آلية التجزئة أكثر تعقيداً لأنه يجب على خادم قواعد البيانات أن يقوم بإدارة هذه العمليات (عمليات التجزئة) وتوزيع البيانات والطلبات بين العقد. لذلك قد يأخذ وقت أكبر لتهيئة هذه البنية وإنشاء المسارات اللازمة لهذه العمليات. ولكن يتم استخدام كل منهما معاً لإنشاء مايدعى بـ sharded cluster بحيث يكون كل جزء مدعوم من قبل replica set مستقلة. ولكن تختلف حالات الاستخدام حسب الحالة لديك وطبيعة النظام والبيانات التي سيتم إجراء عمليات الكتابة والقراءة عليها. فاختيار البنية المناسبة يعود للعديد من العوامل ومنها: نسبة عمليات القراءة إلى عمليات الكتابة، أماكن وجود وتوزّع العقد، تأثيرها على الأداء،...وغيرها الكثير. وبعد جمع وتحليل هذه العوامل يمكنك اختيار المنهجية الأفضل لك.
- 2 اجابة
-
- 1
-
لقد تم إحداث هذه الخاصية في ECMAScript النسخة الخامسة. ويتم إهمالها من قبل النسخ القديمة من الجافاسكريبت. ومن إحدى أهم مزاياها هو أنك لا تستطيع استخدام المتغيّرات التي لم يتم التصريح عنها، ولعلّها تساعد المبرمجين بعدم ارتكاب بعض الأخطاء وتسهّل الوصول إلى الأخطاء عند حدوثها. مثال: "use strict"; x = 3.14; // سيسبب خطأ لأنه لم يتم التصريح مسبقاً عن المتغيّر يجب أن تكون بالشكل التالي: "use strict"; let x = 3.14; في الوضع غير المقيد (أي عند عدم وضع use strict) ، ستكون المتغيرات والتي يمكن الوصول إليها داخل أي دالة عبارة عن مصفوفة مثل الكائن Object على سبيل المثال والذي يحتوي على جميع المعاملات التي يتم تمريرها له عادةً، ستكون هذه المعاملات الموجودة داخلها مراجع إلى نفس القيم المخزنة في تعريف الوظيفة. مثلاً عند تعريف دالة ما تحوي بارامتر واحد وليكن اسمه myArg، سنتمكّن من الوصول إلى هذا المتغير إما من خلال اسمه muArg أو من خلال المصفوفة arguments[0] وعندما نقوم بتغيّر قيمته من خلال هذه المصفوفة ستقوم أيضاً بتغيير قيمته التابعة للاسم نفسه: function myFunc(myArg) { console.log(`${myArg} -- ${arguments[0]}`); arguments[0] = 20; // نقوم هنا بتغيير قيمته من خلال مصفوفة المتغيرات console.log(`${myArg} -- ${arguments[0]}`); } test(10); سنلاحظ هنا أن النتيجة نفسها لكل من مصفوفة المتغيّرات، وأيضاً اسم المتغيّر أو reference: 10 -- 10 20 -- 20 أما إذا قمنا بكتابة use strict وأعدنا تنفيذ هذا التابع: 'use strict'; // قمنا هنا بإضافة use strict function myFunc(myArg) { console.log(`${myArg} -- ${arguments[0]}`); arguments[0] = 20; console.log(`${myArg} -- ${arguments[0]}`); } test(10); سنلاحظ أنه حتى لو غيّرنا قيمة المتغيّر من خلال المصفوفة، فإن ذلك لن يؤثر فعلياً على قيمة المتغيّر نفسه المحجوز في الذاكرة. وعندما نقوم باستدعائه من خلال اسم المتغيّر أو reference سنلاحظ أن قيمته لم تتغيّر واحتفظت بالقيمة نفسها، فيكون الناتج: 10 -- 10 10 -- 20 ^^
- 2 اجابة
-
- 1
-
إن الزمن الافتراضي timeout هو 200 ميلي ثانية، ولكن بإمكانك تغيير timeout limit عند القيام بالاختبار من خلال الأمر نفسه بإضافة الخيار --timeout كالتالي: mocha --timeout 15000 مع تجربة الزمن المناسب لعملياتك. أو: يمكنك وضع التابع الزمني ضمن كل اختبار على حدى، بالشكل التالي: describe('your test here', function(){ this.timeout(15000); it('test', function(done){ this.timeout(15000); setTimeout(done, 15000); }); }); بشكل مماثل يمكنك التحكّم بتعديل timeouts على مستوى suit, hook, test وغيرها من الخصائص التي يمكنك الاطلاع عليها من خلال التوثيق الرسمي لـ mocha
- 1 جواب
-
- 1
-
قد يظهر هذا الخطأ نتيجة لعدة أسباب، ومن الممكن أن حذف الملف mongodb-27017.sock ألا يحل المشكلة في بعض الأحيان. يجب عليك أولاً إعطاء الصلاحيات اللازمة من خلال الأمر التالي: sudo chown `whoami` /tmp/mongodb-27017.sock لأنه قد يظهر هذا الخطأ أحياناً نتيجة لتنفيذ الأمر mongod قبل تنفيذ الأمر التالي: sudo service mongod start لذلك عندها من الممكن أن يحل حذف الملف المشكلة وبعدها يمكنك تشغيل mongodb من خلال الأمر التالي: sudo service mongod start && mongod
-
يمكنك الحصول على قائمة بالتعليمات التي هي قيد التشغيل غلى جهازك من خلال تنفيذ الأمر التالي: sudo lsof -iTCP -sTCP:LISTEN -n -P وبعدها من القائمة يمكنك البحث عن الأمر mongod وأخذ ال PID التابع له، ثم تنفيذ الأمر التالي: sudo kill <pid here> ثم يمكنك إعادة التشغيل من خلال الأمر mongod من جديد. يتم إتباع هذه الطريقة لمعرفة أي تعليمات أو أوامر تشغل منافذ معيّنة في النظام حتى نستطيع تحرير هذه المنافذ واستخدامها.
- 2 اجابة
-
- 1