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

Sam Ahw

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

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

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

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

    16

كل منشورات العضو Sam Ahw

  1. يمكنك من خلال 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"}}} ])
  2. ماهو المتصفّح الذي تقوم باستخدامه؟ حاول إضافة الترميز UTF-8 ضمن ترويسة الصفحة: <head> <meta charset="UTF-8"> //أو <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head>
  3. يجب عليك التأكد من استخدام التابع unset$ بشكل صحيح بإضافة رقم (1) للدلالة على الحقل بدلاً من كتابة اسم الحقل بشكل منفرد، ولحذف هذه الحقول من جميع المستندات نقوم بوضع شرط فارغ للاستعلام { } مع التأكد من إضافة الخاصية multi وإعطائها القيمة true: update({}, {$unset: {ips:1}} , {multi: true}); في حال لم تعمل الطريقة السابقة، يمكنك أيضاً الوصول إلى الحقل الفرعي من خلال المسارات (استخدام النقطة . ) عن طريق ذكر اسم الحقل الأساسي ثم وضع علامة النقطة ثم الحقل الفرعي، وبهذه الطريقة تستطيع الوصول لأي حقل فرعي مهما بلغ العمق. بالشكل التالي: update( {}, { $unset: {'attributes.ips':1}}, false, true )
  4. بعد إضافة المستخدم إلى جدول 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
  5. يمكن إجراء ذلك باستخدام الدالة concat كما في التعليق السابق، وفي حال كنت ترغب بتعديل المجموعة كاملة أي تعديل كافة المستندات الموجودة ضمن المجموعة عن طريق دمج الاسم، يمكنك إضافة الخاصية multi إلى التابع update بهذا الشكل: update( {}, [{ $set: { fullname: { $concat: [ "$firstname", " ", "$lastname" ] } } }], { multi: true } ) أما لإجراء الدمج على مستند محدد، يمكنك إضافة شرط للاستعلام من خلال الخصائص الموجودة (الاسم، الرقم المعرّف،...) وإزالة multi ليتم تطبيق التعديل على مستند واحد فقط.
  6. يتم تطبيق 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});
  7. المشكلة كونك لا تريد استخدام أي أطر عمل، ستضطر للتعامل مع أساسيات لغة PHP بنفسك، وذلك يتطلب المزيد من الوقت والجهد لفهم توابع اللغة الأساسية وتفاصيلها والحالات المختلفة لها. مثال بسيط لرفع الملفات عن طريق PHP: نقوم أولاً بكتابة الصفحة التي ستظهر للمستخدم، حيث سيقوم بالضغط على زر استعراض الملفات من جهازه ثم سيقوم بالضغط على زر (رفع الملف) ليتم رفعها إلى الخادم: <!DOCTYPE html> <html> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> اختر ملف للتحميل <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="رفع الملف" name="submit"> </form> </body> </html> وبالتالي بشكل مشابه باستخدام AJAX نحصل على قيمة الحقل السابق (fileToUpload) ونقوم بتمريرها إلى الخادم من خلال إنشاء طلب من نوع POST أيضاً: $('#upload').on('click', function() { var file_data = $('#fileToUpload').prop('files')[0]; var form_data = new FormData(); form_data.append('file', file_data); $.ajax({ url: 'upload.php', cache: false, contentType: false, processData: false, data: form_data, type: 'post', success: function(php_script_response){ alert(php_script_response); // <-- إظهار رسالة تأكيد يمكن إرسالها كرد من الخادم } }); }); نقوم الآن بكتابة الملف upload.php والذي سيقوم باستقبال الطلب السابق (طلب رفع الملفات) ويقوم بمعالجته: <?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // يمكننا إجراء اختبار بسيط للتأكد من أن الملف الذي تم رفعه هو صورة if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } ?>
  8. الخيار الثاني، كما ويمكنك الاطلاع على التوثيق الرسمي ل GNU لمعرفة المزيد من المعلومات حول الفرق بين كل منهما.
  9. في حالتك الخيار /dev/sda . فهو أول قرص صلب في جهازك ليتم تحميل الملفات اللازمة لنظام التشغيل عليه ضمن المسار الجذر والإقلاع منه. أما الخيار sdb1 يقوم باختيار قسم من القرص الصلب للإقلاع. لأنه بشكل تلقائي يتم تحميل grub مع إضافة المسار بالأمر التالي: grub-install /dev/sda
  10. بدءً من الإصدار 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
  11. تتيح 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 بهذه الطريقة من خلال إحاطته بالعلامة ( / )
  12. نعم إنها بلغة PHP، في حال لم يكن لديك معرفة مسبقة في لغة PHP يجب عليك الاطلاع أولاً على أساسيات اللغة لتستطيع استخدام التوابع والإضافات بالشكل الصحيح.
  13. إن MVC هو اختصار لـ Model View Controller وهي بنية لتصميم البرمجيات (وليست طريقة)، وبالتالي لا تعتمد على إصدار محدد أو لغة برمجة معيّنة، فلن تتأثر بأي نسخة PHP تقوم باستخدامها. على العكس تماماً، تمنح البنية اللازمة والمتينة للبرمجيات التي يتم تطويرها مهما اختلفت لغات البرمجة والإصدارات. أما بالنسبة لاستخدام MVC دون أطر عمل، فذلك يعود لفهمك لهذه البنية وإمكانية تطبيقها بدءً من توزيع هيكلية مجلّدات المشروع وصولاً إلى فصل كل من: المسارات - طبقة التعامل مع البيانات - طبقة المحكّمات. والدوال والتوابع والوسطاء التي يتم استخدامها في كل طبقة. لأن أطر العمل في PHP وخاصةً لارافل مبنية بشكل كامل على بنية MVC وبالتالي لن تحتاج للتعمّق في بناء هيكلية الملفات والتوابع بشكل يدوي. في حال أردت بنائها بنفسك، يجب عليك التعمّق أكثر في فهم هذه البنية ودراسة كيفية عملها لتستطيع تطبيقها في مشاريعك. ولكن كنقطة بداية يمكنك البدء في توزيع هرمية المشروع لديك إلى النقاط الثلاث الأساسية في MVC. كما يمكنك البحث والاطلاع على المقالات والأسئلة المطروحة حول MVC ضمن الأكاديمية.
  14. يمكن إجراء التشفير وفك التشفير في PHP باستخدام الإضافة Cryptography من خلال توابع OpenSSL. حيث يمكنك تشفير سلسلة نصية من خلال التابع التالي: string openssl_encrypt( string $data, string $method, string $key, $options = 0, string $iv, string $tag= NULL, string $aad, int $tag_length = 16 ) والمتغيّرات الأساسية للدالة هي: data: السلسلة النصية التي نرغب بتشفيرها method: طريقة التشفير key: مفتاح التشفير وبعدها يمكنك تخزينها في متغيّر ثم ضمن قاعدة البيانات أو معالجتها بالطريقة التي ترغب بها. ويتم فك التشفير أيضاً من خلال: string openssl_decrypt( string $data, string $method, string $key, int $options = 0, string $iv, string $tag, string $aad) مثال عن تشفير سلسلة نصية: $simple_string = "Welcome to GeeksforGeeks\n"; //طباعة السلسلة النصية الأصلية echo "Original String: " . $simple_string; // طريقة التشفير $ciphering = "AES-128-CTR"; $iv_length = openssl_cipher_iv_length($ciphering); $options = 0; // المتجه الأولي للتشفير $encryption_iv = '1234567891011121'; // مفتاح التشفير $encryption_key = "secretkey"; $encryption = openssl_encrypt($simple_string, $ciphering, $encryption_key, $options, $encryption_iv); // طباعة السلسلة المشفّرة echo "Encrypted String: " . $encryption . "\n"; //أما فك التشفير فيتم بطريقة مماثلة مع استخدام التابع التالي $decryption=openssl_decrypt ($encryption, $ciphering, $decryption_key, $options, $decryption_iv); كما يوجد أيضاً طرق أخرى عديدة للتشفير ومنها مايعرف بـ Hash والذي يستخدم لتشفير كلمات المرور، مثال: $password = 'password12345'; $random = openssl_random_pseudo_bytes(18); $salt = sprintf('$2y$%02d$%s',13,substr(strtr(base64_encode($random), '+', '.'), 0, 22) ); $hash = crypt($password, $salt);
  15. يمكنك الحصول على اللغة من خلال الجافاسكريبت، ولكن لا يوجد طريقة موحّدة مدعومة من قبل كافة المتصفحات لجلب هذه المعلومات فكل متصفّح له خصائصه، ولكن مثلاً يمكنك الحصول على المعلومات التالية وهي مدعومة من قبل أغلب نسخ المتصفحات الحديثة الحالية مثل IE, Chrome, Firefox,...: navigator.browserLanguage: browser language لغة المتصفح navigator.systemLanguage: Windows system language لغة نظام التشغيل navigator.userLanguage: Windows user-specific language لغة مخصصة من قبل المستخدم ولكن يجب عليك تحديد المتصفّح المستهدف أو نظام تشغيل محدد ومن ثم ماهي لغة البرمجة أو التقنية التي ترغب من خلالها بالحصول على هذه المعلومات. فالجافاسكريبت ومتصفحات الويب ستختلف عن تطبيقات الهاتف في حال كان هدفك هو الحصول على اللغة ضمن أجهزة الهاتف.
  16. يوجد عدد من الخطوات التي يمكنك تنفيذها والتي تقوم بحل هذه المشكلة التي قد تظهر نتيجة عدّة أسباب. وباتباع الخطوات التالية بالترتيب للتأكد من تضمينها بالشكل الصحيح: يمكنك تضمين المكتبة من خلال composer الأمر التالي: composer require laravel/passport والتأكد من تسجيل الخدمة في config/app.php: Laravel\Passport\PassportServiceProvider::class, وبعدها إجراء التهجير اللازم: php artisan migrate وأخيراً، في أغلب الأحيان تظهر رسائل الخطأ لأننا لا نقوم بتوليد مفاتيح التشفير بشكل صحيح: php artisan passport:keys وبعدها تنفيذ الأمر التالي: php artisan passport:client --personal
  17. تحقّق من أن المودل الخاص بجدول المستخدم والذي يقوم باستخدام \Laravel\Passport\HasApiTokens يحوي على خانة البريد الالكتروني email، لأن البريد الالكتروني هو الافتراضي الذي يتم استخدامه أثناء عملية التحقق والتوثيق. ففي حال كان الجدول لديك يحوي اسم مستخدم username أو أي خانة أخرى يتم استخدامها بدلاً من البريد الالكتروني في عملية التوثيق يجب عليك استخدام التابع findForPassport في هذا المودل كالتالي: public function findForPassport($username) { return self::where('username', $username)->first(); أو أي خانة يتم استخدامها في عملية التوثيق } ومن ثم يمكنك استخدام getAuthIdentifier وكتابة التابع الخاص بمتحكّم التوثيق على الشكل التالي: public function getUserEntityByUserCredentials($username, $password, $grantType, ClientEntityInterface $clientEntity) { if (is_null($model = config('auth.providers.users.model'))) { throw new RuntimeException('cant reach user model'); } if (method_exists($model, 'findForPassport')) { $user = (new $model)->findForPassport($username); //أو الخانة التي يتم استخدامها في التوثيق } else { $user = (new $model)->where('email', $username)->first(); } if (! $user || ! $this->hasher->check($password, $user->password)) { return; } return new User($user->getAuthIdentifier()); }
  18. يظهر هذا الخطأ في لارافل عند عدم توفّر المجلّدات الفرعية اللازمة لعمل المشروع ضمن المجلّد storage تأكد من توافر هذه المجلّدات app, framework, logs ضمن المجلّد storage وأيضاً أنك قمت بنسخ محتوياتها من: cache - session- testing عند نقل المشروع. وأيضاً تأكد من وجود السطر التالي: storage_path('framework/views') ضمن المسار: /config/view.php ثم قم بتنفيذ الأمر التالي: php artisan cache:clear
  19. تحدث هذه المشكلة أحياناً في الإصدارات الأقدم من لارافل عند استخدام return view أو return View::Make في المتحكّم المسؤول عن التعامل مع بيانات الفورم، بينما يجب استخدام: return redirect()->route() كما يمكنك تجربة استخدام: Session::now('some_key', 'message'); أو: session()->now('some_key', 'message');
  20. يجب عليك عند إضافة حقول جديدة التأكد من إضافتها إلى كل من: جدول قاعدة البيانات، والمودل الموافق له. فلديك في مودل المستخدم user، لم يتم إضافة هذه البيانات الجديدة: protected $fillable = [ 'name', 'email', 'password', ]; نجد أنها لا تحوي الخاصية fullname والتي نقوم بإضافة بيانات لها في الاستعلام الذي نقوم بتنفيذه
  21. إن backslash محجوزة في بايثون وتستخدم لإجراء escape من بعض الإشارات المميزة في السلاسل النصية مثل إضافة سطر جديد (\n) أو مسافة (\t)،... إلخ. وعند كتابة خط مائل واحد، يقوم Python lexical analyser بدلاً من إظهار خطأ بإضافة خط مائل آخر للنص لتجنّب هذا الخطأ في السلسلة النصية. ولكن لايتم إضافتها فعلياً لقيمة المتغيّر وإنما يتم إظهارها بهذا الشكل فقط في البيئة، أما إذا قمت بالطباعة فسيتم معالجتها بشكل مختلف. فإذا أردت إضافة backslash ضمن السلسلة النصية لديك يجب أن تقوم بكتابة خط مائل آخر backslash فتصبح بصورة مزدوجة كالتالي: x = "hello, \\world" وفي الطباعة print("\\") أو print "\\"
  22. في حال كانت المشكلة بمسار الملف index.html وترغب بتعديل جذر المشروع ليصبح بداخل المجلّد dist أو أي مجلّد آخر، يمكنك تغيير المسار إلى dist من خلال الخطوات التالية: أولاً التأكد من عدم وجود dist ضمن الملف .gitignore. ثانياً: تنفيذ الأمر التالي: git add dist && git commit -m "dist subtree commit" ثالثاً: دلالة github pages إلى المجلّد dist: git subtree push --prefix dist origin gh-pages
  23. يمكن تنفيذ ذلك بعدّة طرق حسب بنية الصفحة لديك وإطار العمل الذي تقوم باستخدامه في كل من الجافاسكريبت و CSS، على سبيل المثال يمكنك إضافة الخاصية resizable الموجودة في jQuery كالتالي: $(function() { $( "img" ).resizable(); }); وربطها مع عنصر الصورة مع وضع التنسيقات اللازمة له، مثل تحديد عرض وارتفاع محددين <img id="resizable" src="your_image_src" height=200px width=200px> كما يمكنك تحديد عرض وطول أعظمي من خلال CSS لعدم تجاوزهم من قبل المستخدم أثناء التعديل. وأيضاً يوجد حل آخر باستخدام CSS3 ولكنه غير مدعوم من قبل جميع المتصفحات: img { resize: both; overflow: auto; } وطبعاً يوجد حلول أخرى في أطر العمل المختلفة ومكاتب إضافية لتنفيذ ذلك.
  24. يمكننا مساعدتك بشكل أفضل عندما تذكر تفاصيل أكثر مثل كتابة الكود الذي استخدمته لرفع الصور وأيضاً ماهي المكتبة التي تقوم باستخدامها لمعالجة ذلك وأخيراً الجزء الخاص بتحديد الملفات من واجهة المستخدم. فبما أن رسالة الخطأ هي 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 قبل استقبال القيم إلى المتحكّم الخاص بذلك، وتستطيع الاطلاع عن كيفية تحقيق ذلك من خلال التوثيق لهذه المكتبة أو أي مكتبة تقوم باستخدامها في مشروعك لتحميل الملفات. لأن كل مكتبة لها طريقة تضمين والتعامل معها مختلف.
  25. عند إنشاء بيئة virtualenv جديدة فقط قم بتمرير --python أو -p لتحديد أي نسخة ترغب بتشغيلها، مع تمرير مسار virtualenv. مثال: virtualenv --python=/usr/bin/python3.8 <نضع هنا مسار virtualenv> ولكن مع نسخ python3، ينصح التوثيق الرسمي بإنشاء البيئة الافتراضية من خلال الأمر التالي: python3 -m venv <envname> ولكن يجب عليك الانتباه إلى أن venv لا يسمح بإنشاء البيئة الافتراضية مع إصدارات أخرى من بايثون، لذلك يتوجب عليك أن تكون مثبّت حزمة virtualenv مسبقاً.
×
×
  • أضف...