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

عبدالله عبدالرحمن11

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

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

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

كل منشورات العضو عبدالله عبدالرحمن11

  1. في توثيق MongoDB الرسمي يوجد العديد من الحلول لهذه المشكلة. يمكنك أيضًا تجربة هذا الحل: ملاحظة: جرب توجيهات التوثيق الرسمي إذا كان إصدار MongoDB أكبر من 3.0 افتح ملف /etc/init.d/mongod (إذا لم يكن هناك سيكون هنا /etc/init.d/mongod أو /etc/init/mongod.conf أضف الأسطر أدناه مباشرة بعد chown $DAEMONUSER /var/run/mongodb.pid وقبل end script أعد تشغيل mongod service mongod restart فيما يلي الأسطر التي يجب إضافتها إلى /etc/init.d/mongod: if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
  2. يمكنك إنشاء حلقة جافا سكريبت تقوم بالمهمة ثم تنفيذها في mongo console var dbs = db.getMongo().getDBNames() for(var i in dbs){ db = db.getMongo().getDB( dbs[i] ); print( "dropping db " + db.getName() ); db.dropDatabase(); } احفظه في dropall.js ثم نفّذه: mongo dropall.js
  3. بس الكود في الصورة شغال ولا يوجد أي مشكلة احتمال تكون المشكلة في إعدادات الانتينا
  4. يا @علي العبسيالرمزين هذين [ ] في بايثون تسمى بقائمة وتقوم بإضافة أي عدد من العناصر داخل القائمة المهم أن تضع فاصلة , لكي تضيف عنصر جديد في القائمة الى جانب العنصر السابق وفي القائمة الخاص بك يمكنك إضافة فاصلة عند آخر عنصر موجود ومن ثم إضافة عنوان الماك الجديد كما في العناوين السابقة
  5. الثلاث النقاط معناها بقية الكود السابق يعني هكذا mac_addresses = [ {"mac": "68:72:51:60:71:C0", "comment": "A1"}, {"mac": "68:72:51:60:74:93", "comment": "A2"}, {"mac": "68:72:51:60:72:95", "comment": "A3"}, {"mac": "68:72:51:60:72:83", "comment": "A4"}, {"mac": "68:72:51:60:71:42", "comment": "A5"}, {"mac": "68:72:51:60:73:24", "comment": "A6"}, {"mac": "68:72:51:60:71:74", "comment": "A7"}, {"mac": "78:8A:20:60:3F:97", "comment": "A10"}, {"mac": "FC:EC:DA:62:C8:E4", "comment": "A13"}, {"mac": "F4:92:BF:34:2E:1A", "comment": "A31"}, {"mac": "48:8F:5A:48:FE:D2", "comment": "LAN1"}, {"mac": "48:8F:5A:48:FE:D3", "comment": "LAN2"}, {"mac": "48:8F:5A:48:FE:D4", "comment": "LAN3"}, {"mac": "48:8F:5A:48:FE:D5", "comment": "LAN4"}, {"mac": "48:8F:5A:48:FE:D6", "comment": "LAN5"}, {"mac": "48:8F:5A:48:FE:D7", "comment": "LAN6"}, {"mac": "48:8F:5A:48:FE:D8", "comment": "LAN7"}, {"mac": "48:8F:5A:48:FE:D9", "comment": "LAN8"}, {"mac": "48:8F:5A:48:FE:DA", "comment": "LAN9"}, {"mac": "48:8F:5A:48:FE:DB", "comment": "LAN10"}, {"mac": "48:8F:5A:48:FE:DC", "comment": "LAN11"}, {"mac": "48:8F:5A:48:FE:DD", "comment": "LAN12"}, {"mac": "48:8F:5A:48:FE:DE", "comment": "LAN13"},# في الأسفل العناوين الجديد وفي الأعلى العناوين السابقة {"mac": "F4:92:BF:B0:E3:FC", "comment": "A42"}, {"mac": "F4:92:BF:F5:BA:96", "comment": "A38"}, {"mac": "F4:92:BF:F4:B8:57", "comment": "A37"}, {"mac": "F4:92:BF:F4:AB:94", "comment": "A36"}, ]
  6. نعم كلما عليك فعله هو إضافة العنوان الجديد في الأسفل مثلما وضحت لك
  7. السبب هو أن الخيار strict يكون true بشكل افتراضي ، وبذلك سيتم منع إضافة حقول لم تكن موجودة في schema ولحل هذه المشكلة هي تغيير قيمة strict من true الى false كالآتي var thingSchema = new Schema({..}, { strict: false }); أو يمكنك تعديل strict من خلال الإستعلام كالآتي Model.findOneAndUpdate( query, // فلتر update, // البيانات المراد تحديثها { //الخيارا returnNewDocument: true, new: true, strict: false } )
  8. يمكنك إستخدام الآتي db.MYCOLLECTION.find({ phone: { $type: 2 } }).forEach(function(obj){ try {// تحويل من سلسلة نصية الى رقم obj.phone = parseInt(obj.phone); // حفظ القيم الجديدة db.MYCOLLECTION.save(obj); } catch(e) { // تنفيذ كود عند حدوث خطأ } }); حيث phone: { $type: 2 } يُخبر mongo لتحميل كل phone التي قيمها من نوع string سلسلة نصية
  9. يمكنك إستخدام مكتبة smtplib الذي يقوم بإنشاء جلسة عميل SMTP والذي من خلاله يمكنك إرسال بريد الى أي جهاز لديه مُستمع SMTP أو مُستمع ESMTP و SMTP اختصار ل Simple Mail Transfer Protocol أي برتوكول نقل البريد البسيط وهذا الكود جاهز للإتصال بSTMP الخاص بجيميل ومن ثم بدء جلسة وتسجيل الدخول ببريد وكلمة سر المُرسل ومن ثم إرسال رسالة الى عنوان المُستقبل وفي الآخير إنهاء الجلسة import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText mail_content = "محتوى الرسالة" #عنوان البريد وكلمة المرور sender_address = 'sender123@gmail.com' #بريد المُرسل sender_pass = 'xxxxxxxx' # كلمة سر المُرسل receiver_address = 'receiver567@gmail.com' #بريد المُستلم #إعداد MIME message = MIMEMultipart() message['From'] = sender_address message['To'] = receiver_address message['Subject'] = 'A test mail sent by Python. It has an attachment.' #سطر العنوان #جسم الرسالة والملحقات message.attach(MIMEText(mail_content, 'plain')) #إنشاء جلسة # SMTP # لإرسال الرسالة session = smtplib.SMTP('smtp.gmail.com', 587) #إستخدام gmail session.starttls() #تفعيل الحماية session.login(sender_address, sender_pass) #تسجيل الدخول text = message.as_string() session.sendmail(sender_address, receiver_address, text) session.quit() print('Mail Sent')
  10. يمكنك الحصول على قائمة الأسماء المكررة بعمل aggregate تجميع Group كل السجلات الذي لها نفس قيمة الحقل username مطابقة Match هذه المجموعات groups الي لديها سجلات أكبر من 1 ثم تجميع group مرةً أخرى الى project كل الأسماء المكررة كمصفوفة array الكود db.collection.aggregate([ {$group:{"_id":"$username","name":{$first:"$username"},"count":{$sum:1}}}, {$match:{"count":{$gt:1}}}, {$project:{"name":1,"_id":0}}, {$group:{"_id":null,"duplicateNames":{$push:"$username"}}}, {$project:{"_id":0,"duplicateNames":1}} ])
  11. عندما تقوم بطباعة الكائن بإستخدام ()console.log مباشرةً فلن تحصل عليه كاملاً إذا كان الكاائن كبيراً أو يحتوي العديد من الكائنات الفرعية المتداخلة فهناك عدة طرق لطباعة الكائن كاملاً مثل تحويله الى JSON وطباعته كما في المثال let obj = {name:'Ahmed',email:'ahmed2021@gmail.com'} console.log("Full Object: %j",obj) أو إستخدام JSON.stringify وإضافة الخيارات options console.log(JSON.stringify(myObject, null, 4)); أو إستخدام const util = require('util') console.log(util.inspect(myObject, {showHidden: false, depth: null})) // بديل مختصر console.log(util.inspect(myObject, false, null, true /* تفعيل الألوان */)) أو إستخدام ()console.dir مع إضافة خيار option العمق null لكي يقوم بطباعته مهما كان عمق الكائن console.dir(myObject, { depth: null });
  12. هذا مُولد للحصول على الأجزاء التي تريدها def chunks(lst, n): for i in range(0, len(lst), n): yield lst[i:i + n] # يمكنك إستخدامها كالتالي import pprint pprint.pprint(list(chunks(range(10, 75), 10))) اما إذا كنت تستخدم بايثون إصدار 2 فيجب عليك إستخدام ()xrange بدلاً من ()range كما هو موضح في الكود def chunks(lst, n): for i in xrange(0, len(lst), n): yield lst[i:i + n]
  13. يتمثل مبدأ التصميم العام في Python في الوظائف (الدوال) التي تغير كائنًا في مكانه ولاتقوم بإنشاء كائن جديد ، فإن هذه الدالة تقوم بإرجاع None . وهذا أساسًا للتأكيد على عدم إرجاع كائن جديد. أي إذا كان لديك دالة تعمل على الكائن الأصلي وتقوم بتعديله في مكانه فهذه الدالة لا تقوم بإرجع أي شيء لأنه لا يوجد كائن جديد تريد إرجاعه ولهذا العديد من دوال بايثون تقوم بإرجع none ويعتبر none ك false فعلى سبيل المثال دالة ()append تقوم بتعديل الكائن الأصلي في مكانه ولا تقوم بإرجاع كائن جديد لذلك في تقوم بإرجاع none
  14. المشكلة هي أنك تقوم بإستخدام دالة ()remove من أجل إزالة الحروف المتحركة فلا تقم بإستخدامها في قائمة بينما تقوم بالتكرار فيها يمكنك إستخدام دالة ()replace كما في هذا الكود للحصول على النتيجة المرغوبة text = "Hellooo, world! Words!" def anti_vowel(c): newstr = "" # الحروف المتحرك vowels = ('a', 'e', 'i', 'o', 'u') for x in c.lower(): # فحص إذا كان هناك حرف متحرك if x in vowels: # إزالة الحرف المتحرك newstr = c.replace(x, "") #إرجاع النص الجديد الخالي من الحروف المتحركة return newstr print(anti_vowel(text))
  15. عندما نقوم بالتخزين فهناك نوعين للتخزين وهما تخزين البيانات ،وتخزين الملفات وطرق تخزين كلاً منهما تختلف عن الآخرى ويفضل عدم استخدام الملفات في قواعد البيانات لأن هذا ليس عملي يمكنك تخزين ملفات أو صور في mongodb ويسمى بمستند BSON لكن الحد الأقصى لحجم الملف هو 16 ميجا أي إذا كان حجم الملف أكبر فيجب عليك تقسيمه لأجزاء بحجم 16 ميجا لكي تستطيع حفظه في mongodb ويمكنك حفظها كنوع BinData أي بيانات ثنائية ، ويمكنك إستخدام GridFs لتخزين الملفات الذي حجمها يتجاوز 16 ميجا String newFileName = "my-image"; // إنشاء ملف صورة File imageFile = new File("/users/victor/images/image.png"); /* إنشاء GridFS بإسم صورة */ GridFS gfsPhoto = new GridFS(db, "photo"); GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile); gfsFile.setFilename(newFileName); // حفظ الملف gfsFile.save();
  16. على الرغم من $date جزء من MongoDB Extended JSON وهذا ما تحصل عليه بشكل افتراضي مع mongoexport لا أعتقد أنه يمكنك حقًا استخدامه كجزء من الاستعلام. مثال على ذلك db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}}) ستحصل على هذا الخطأ error: { "$err" : "invalid operator: $date", "code" : 10068 } ولكن يمكنك الإستعلام بهذه الطريقة db.mycollection.find({ "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")} }) أو بهذه db.mycollection.find({ "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")} })
  17. السبب عند مقارنة الرقم الفريد id_ مع id_ آخر يقوم بإظهار false دائماً حتى إذا كانا متشابهين ، لأن المقارنة في mongoose تتم بين عنوان أو مرجع الكائن Object Reference ولا يتم مقارنة سلسلة نص id_ ، ولكي يتم مقارنة سلسلة نص id_ فيمكنك إستخدام دالة ()toString لكي يتم مقارنة سلسلة نص id_ وليس مقارنة عناوين الكائن Object reference أويمكنك إستخدام دالة ()equals. لمقارنة سلاسل نصوص id_ كما هو موضح في الكود الأسفل results.userId.equals(AnotherMongoDocument._id) الآن لديك ثلاثة طرق لعمل مقارنة صحيحة //بإستخدام دالة toString() AnotherMongoDocument._id.toString() // بإستخدام دالة JSON.stringify() JSON.stringify(AnotherMongoDocument._id) // بإستخدام دالة equals() results.userId.equals(AnotherMongoDocument._id)
  18. في الوقت الحالي لا يوجد أمر في mongodb لعمل ذلك ، ولكن تستطيع إستخدام هذا الكود لعمل ذلك db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); }); ملاحظة يجب أن تكون قاعدتي البيانات تشارك نفس mongod لكي تعمل هذه الطريقة والى جانب المذكور سابقاً يمكنك إستخدام mongodump لتصدير مجموعة collection واستيرادها من في قاعدة البيانات الآخرى بإستخدام mongorestore
  19. يمكنك إستخدام الكود الآتي للحصول على المطلوب ، حيث يقوم هذا الكود بكتابة المحتوى الى ملف جديد وتبديل الملف القديم بالملف الجديد from tempfile import mkstemp from shutil import move, copymode from os import fdopen, remove def replace(file_path, pattern, subst): #إنشاء ملف مؤقت fh, abs_path = mkstemp() with fdopen(fh,'w') as new_file: with open(file_path) as old_file: for line in old_file: new_file.write(line.replace(pattern, subst)) #نسخ الصلاحيات من الملف القديم الى الملف الجديد copymode(file_path, abs_path) # حذف الملف الأصلي remove(file_path) # تحريك الملف الجديد move(abs_path, file_path)
  20. هذه هي القائمة الذي تحوي العناوين mac_addresses = [ {"mac": "68:72:51:60:71:C0", "comment": "A1"}, {"mac": "68:72:51:60:74:93", "comment": "A2"}, {"mac": "68:72:51:60:72:95", "comment": "A3"}, {"mac": "68:72:51:60:72:83", "comment": "A4"}, {"mac": "68:72:51:60:71:42", "comment": "A5"}, {"mac": "68:72:51:60:73:24", "comment": "A6"}, {"mac": "68:72:51:60:71:74", "comment": "A7"}, {"mac": "78:8A:20:60:3F:97", "comment": "A10"}, {"mac": "FC:EC:DA:62:C8:E4", "comment": "A13"}, {"mac": "F4:92:BF:34:2E:1A", "comment": "A31"}, {"mac": "48:8F:5A:48:FE:D2", "comment": "LAN1"}, {"mac": "48:8F:5A:48:FE:D3", "comment": "LAN2"}, {"mac": "48:8F:5A:48:FE:D4", "comment": "LAN3"}, {"mac": "48:8F:5A:48:FE:D5", "comment": "LAN4"}, {"mac": "48:8F:5A:48:FE:D6", "comment": "LAN5"}, {"mac": "48:8F:5A:48:FE:D7", "comment": "LAN6"}, {"mac": "48:8F:5A:48:FE:D8", "comment": "LAN7"}, {"mac": "48:8F:5A:48:FE:D9", "comment": "LAN8"}, {"mac": "48:8F:5A:48:FE:DA", "comment": "LAN9"}, {"mac": "48:8F:5A:48:FE:DB", "comment": "LAN10"}, {"mac": "48:8F:5A:48:FE:DC", "comment": "LAN11"}, {"mac": "48:8F:5A:48:FE:DD", "comment": "LAN12"}, {"mac": "48:8F:5A:48:FE:DE", "comment": "LAN13"}, ] والعناوين الإضافية تقوم بإضافتها في أسفل القائمة كهذا المثال [ ..., {"mac": "48:8F:5A:48:FE:ER", "comment": "LAN14"}, ] ويمكنك تكرار العملية وإضافة عناوين mac كما تشاء
  21. يمكنك تقسيم البيانات كالآتي # استيراد دالة # LeavePOut from sklearn.model_selection import LeavePOut # استيراد numpy import numpy as np X = np.array([[1, 2], [3, 4], [5, 6], [7, 8],[9,10]]) y = np.array([0,1,1,0,0]) # تحديد عدد العينات الى 2 lpo = LeavePOut(2) # طباعة عدد التقسيمات print(lpo.get_n_splits(X)) print(lpo) LeavePOut(p=2) # تقسيم البيانات for train_index, test_index in lpo.split(X): for x in range(0,len(test_index)): for z in range(1,len(test_index)): if(y[test_index[x]] != y[test_index[z]]): # طباعة البيانات المُقسمة print("TRAIN:", train_index, "TEST:", test_index) X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index]
  22. الخطأ يقول أن هذا الأمر قد يعمل ولكن سيتم حذفه وعدم إستخدام هذا الأمر يجب عليك تنفيذ الأمر brew services start mongodb وعندما تريد تثبيت أو ترقية mongodb ، ف brew سيخبرك بماذا يجب عليك فعله ولتشغيل mongodb بعد تسجيل الدخول يمكنك تنفيذ هذا الأمر ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents ولتشغيل mongodb في الحال ، قم بتنفيذ الأمر التالي launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist أو يمكنك ببساطة كتابة mongod
  23. يمكنك تنزيل الملفات الكبيرة عبر تقسيمها وتنزيلها أجزاء chunks ، وإذا أردت الحصول على مؤشر تتبع تقدم التحميل فهناك عدة طرق لذلك وهذا مثال للتنزيل كأجزاء مع مؤشر تتبع تقدم التحميل from clint.textui import progress r = requests.get(url, stream=True) path = '/some/path/for/file.txt' with open(path, 'wb') as f: total_length = int(r.headers.get('content-length')) # حساب الحجم الكلي for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): # تنزيل أجزاء بحجم 1024 بايت if chunk: f.write(chunk) f.flush() ومؤشر تتبع تقدم التحميل سيظهر كالآتي [################################] 5210/5210 - 00:00:01 أو يمكنك تثبيت wget pip install wget وإستخدامها كالآتي import wget wget.download('http://download.geonames.org/export/zip/US.zip') والمُخرجات ستظهر كالآتي 11% [........ ] 73728 / 633847
  24. لحل هذه المشكلة في النسخ الحديثة من إصدار 3.3 ومافوق تستطيع إستخدام دالة Pool.starmap والذي تقبل سلسلة من المُدخلات ، ومن ثم ستقوم بتمرير المُدخلات تلقائياً الى الدالة المراد إعطائها المُدخلات ، كما هو موضح في المثال import multiprocessing from itertools import product def merge_names(a, b): return '{} & {}'.format(a, b) if __name__ == '__main__': names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie'] with multiprocessing.Pool(processes=3) as pool: results = pool.starmap(merge_names, product(names, repeat=2))# تمرير الدالة مع المُدخلات print(results) أما للنسخ الأقدم فستحتاج الى كتابة دالة مساعدة كما في المثال import multiprocessing from itertools import product from contextlib import contextmanager def merge_names(a, b): return '{} & {}'.format(a, b) def merge_names_unpack(args): return merge_names(*args) @contextmanager def poolcontext(*args, **kwargs): pool = multiprocessing.Pool(*args, **kwargs) yield pool pool.terminate() if __name__ == '__main__': names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie'] with poolcontext(processes=3) as pool: results = pool.map(merge_names_unpack, product(names, repeat=2)) # تمرير الدالة المساعدة مع المُدخلات print(results)
×
×
  • أضف...