مطابقة

  • اختبار جزئي لتطابق JSON في RSpec

    التحدي الذي تواجهه يتعلق بتحديد جزء محدد من بيانات JSON داخل تركيبة معقدة، وذلك باستخدام RSpec لاختبار التطبيق. في هذه الحالة، ترغب في البحث عن تطابق جزئي داخل هيكل متداخل، مع تجاهل بقية البيانات.

    من الواضح أن الطريقة التي تستخدمها الآن ليست كافية، وترغب في إيجاد حلاً يتيح لك البحث عن تطابق جزئي داخل هيكل الـ JSON. في الوقت الحالي، تستخدم include مع تحديد محدد للمفتاح الرئيسي، ومن ثم التحقق من تواجد وقيمة المفتاح الفرعي، ولكن هذه الطريقة لا تدعم التطابق الجزئي داخل الهيكل المتداخل.

    للقيام بذلك، يمكنك استخدام ميزة المطابقة الجزئية في RSpec باستخدام match بدلاً من include. هذا يسمح لك بتحديد هيكل متداخل يجب أن يحتوي على جزء من البيانات بدلاً من تطابق الهيكل بالكامل. وبما أنك ترغب في التحقق من تواجد مفتاح employee مع قيمة معينة لـ jobs_count، يمكنك القيام بذلك على النحو التالي:

    ruby
    expect(response_json).to match({ "employee" => { "jobs_count" => 0 } })

    هذا الكود يستخدم match بدلاً من include، مما يسمح لك بتحديد هيكل متداخل وتحقق من وجود مفتاح معين مع قيمة محددة، دون الحاجة إلى تحديد البيانات الأخرى في الهيكل. بالتالي، يتيح لك هذا الحل تحقيق التطابق الجزئي الذي تبحث عنه، وتجاهل البيانات الأخرى في الهيكل.

    المزيد من المعلومات

    عندما يتعلق الأمر باختبار التطبيقات وضمان جودتها، فإن تحديد أجزاء محددة من بيانات JSON داخل هيكل معقد يمكن أن يكون مهمة صعبة. في بعض الأحيان، قد تكون الحاجة إلى التحقق من تواجد قيم محددة داخل هيكل متداخل دون الاهتمام بالبيانات الأخرى. وهنا تأتي ميزة المطابقة الجزئية في RSpec لتوفير حلاً لهذا التحدي.

    عادةً ما يتم استخدام include في RSpec للتحقق من تواجد عنصر معين في هيكل JSON. ومع ذلك، فإن هذه الطريقة لا تدعم التطابق الجزئي داخل الهيكل المتداخل، حيث يتطلب التحقق من التطابق الكامل بالنسبة للهيكل بأكمله.

    لتحقيق التطابق الجزئي داخل الهيكل المتداخل، يمكن استخدام match بدلاً من include. هذا يسمح بتحديد هيكل متداخل يجب أن يحتوي على جزء محدد من البيانات، بدلاً من تحديد الهيكل بأكمله.

    على سبيل المثال، إذا كنت ترغب في التحقق من تواجد مفتاح employee مع قيمة معينة لـ jobs_count، يمكنك استخدام match كما يلي:

    ruby
    expect(response_json).to match({ "employee" => { "jobs_count" => 0 } })

    باستخدام هذا النهج، يمكنك التحقق من وجود مفتاح معين مع قيمة محددة داخل الهيكل المتداخل، دون الحاجة إلى تحديد البيانات الأخرى في الهيكل. هذا يوفر لك مرونة أكبر في اختبار بيانات JSON معقدة ويسهل عملية الاختبار بشكل أكثر دقة وفعالية.

  • تصريح أسماء النماذج والكولكشنات في Mongoose

    في نظام MongoDB، عند استخدام Mongoose للتفاعل مع قاعدة البيانات، تحتاج إلى تحديد اسماء الكولكشن والنماذج بشكل صحيح لتفادي الأخطاء التي تواجهك. يبدو أن المشكلة تنتج من الطريقة التي تقوم بها بتحديد اسماء الكولكشن والنماذج.

    لفهم الوضع بشكل أفضل وتقديم الحلول المناسبة، دعني أوضح لك كيفية تعريف اسماء الكولكشن والنماذج بطريقة صحيحة باستخدام Mongoose.

    أولاً، يجب أن تتأكد من أن كل نموذج يرتبط بكولكشن معين في قاعدة البيانات. في حالتك، كل النماذج ترتبط بنفس الكولكشن وهي “categories”. ومن الواضح أنك ترغب في تخزين ثلاثة أنواع مختلفة من الوثائق في هذا الكولكشن.

    ثانياً، يمكنك تحقيق هذا باستخدام الأسماء المناسبة للنماذج والكولكشنات.

    لنبدأ بتحديد النماذج بشكل صحيح:

    javascript
    const mongoose = require('mongoose'); // تعريف نموذج الفئات const Category = mongoose.model('Category', CategorySchema); // تعريف نموذج المواضيع const Topic = mongoose.model('Topic', TopicSchema); // تعريف نموذج المقالات const Article = mongoose.model('Article', ArticleSchema);

    هنا قمنا بتحديد كل نموذج بشكل منفصل مع استخدام اسماء فريدة لكل نموذج.

    ثالثاً، يجب أن نحدد اسم الكولكشن المستخدم لكل نموذج. يمكنك تحديد اسم الكولكشن عند تعريف النموذج باستخدام الخيار ‘collection’:

    javascript
    // تعريف نموذج الفئات وتحديد اسم الكولكشن const Category = mongoose.model('Category', CategorySchema, 'categories'); // تعريف نموذج المواضيع وتحديد اسم الكولكشن const Topic = mongoose.model('Topic', TopicSchema, 'categories'); // تعريف نموذج المقالات وتحديد اسم الكولكشن const Article = mongoose.model('Article', ArticleSchema, 'categories');

    وهكذا، يتم تحديد كل نموذج بحيث يكون مرتبطاً بنفس الكولكشن وهو “categories”.

    بهذا الشكل، يجب أن يتم إصلاح الأخطاء التي واجهتك مثل “Cannot overwrite categories model once compiled”، وستتمكن من تخزين السجلات الثلاثة في الكولكشن “categories” كما ترغب دون إنشاء كولكشنات إضافية غير مطلوبة.

    المزيد من المعلومات

    بالطبع، سنكمل المقال بشرح أكثر تفصيلًا حول كيفية استخدام الأسماء المناسبة للنماذج والكولكشنات في Mongoose، بالإضافة إلى بعض النقاط الإضافية التي قد تكون مفيدة.

    أولاً وقبل كل شيء، يجب أن ندرك أهمية استخدام أسماء فريدة لكل نموذج وكولكشن في قاعدة البيانات. هذا يساعد في تنظيم البيانات بشكل فعال وتجنب التضاربات أو الأخطاء في التعامل معها.

    ثانياً، عند استخدام Mongoose، يجب عليك فهم العلاقة بين النماذج والكولكشنات. عند تحديد نموذج جديد، يتم تخزينه في ذاكرة التعليمات البرمجية الخاصة بـ Mongoose، ولا يتم تنفيذه في قاعدة البيانات حتى تتم عملية الاتصال بالقاعدة وتفعيل التطبيق.

    ثالثًا، تعتبر وظيفة “mongoose.model()” هي التي تستخدم لتحديد النموذج، وتأخذ ثلاثة مدخلات: اسم النموذج، والمخطط (Schema)، واسم الكولكشن إذا كانت هناك حاجة لتخصيص اسم الكولكشن.

    وأخيرًا، يُستخدم الخيار “collection” لتحديد اسم الكولكشن في حال كان يختلف عن الاسم الافتراضي الذي يولده Mongoose. هذا يأتي بشكل مفيد في حالة وجود حاجة لتخزين عدة أنواع من البيانات في كولكشن واحد.

    بناءً على النقاط المذكورة أعلاه، يمكننا التوصل إلى النتيجة التالية:

    1. قم بتحديد كل نموذج بشكل مستقل باستخدام مكالمة “mongoose.model()” وحدد اسم النموذج بشكل فريد لكل منها.
    2. استخدم الخيار “collection” إذا كنت بحاجة إلى تخصيص اسم الكولكشن.
    3. تأكد من أن جميع النماذج المرتبطة بنفس الكولكشن تشير إلى نفس الاسم لضمان عمليات التخزين والاسترجاع بشكل صحيح.

    من خلال اتباع هذه الإرشادات، يمكنك تجنب الأخطاء وضمان عملية التخزين والاسترجاع من قاعدة البيانات بسلاسة وبدون مشاكل.

  • استخدام REGEXP في SQL لمطابقة الكلمات بناءً على الأحرف المعطاة

    للقيام بمطابقة الكلمات باستخدام جميع الأحرف المعطاة في أي موضع في الكلمة، يمكن استخدام تعبيرات البحث العادية في SQL بالاعتماد على وظيفة مثل LIKE. ولكن، يجب أن نكون حذرين لأنه يمكن أن يؤدي ذلك إلى تطابق غير دقيق إذا تم استخدامه بشكل خاطئ. على سبيل المثال، إذا استخدمنا LIKE '%VW%' فسيتم التطابق مع أي كلمة تحتوي على “VW” في أي موضع داخل الكلمة، بما في ذلك الكلمات التي تحتوي على “V” و “W” بشكل منفصل.

    لحل هذا المشكلة، يمكن استخدام تعبيرات البحث العادية مع جملة REGEXP في قواعد البيانات التي تدعمها. بشكل عام، REGEXP تسمح بتحديد أنماط معينة للبحث في النصوص، ويمكن استخدامها هنا لتحديد الكلمات التي تحتوي على جميع الأحرف المعطاة في أي موضع داخل الكلمة.

    في قاعدة البيانات MySQL، يمكن استخدام REGEXP مع تعبيرات الانتقاء (character classes) والتعبيرات العادية (regular expressions) لتحقيق ذلك. على سبيل المثال، يمكن استخدام [VW] للبحث عن أي كلمة تحتوي على “V” أو “W” في أي موضع داخل الكلمة. وباستخدام ^ و $، يمكننا تحديد بداية ونهاية الكلمة.

    إليك استعلام SQL للبحث عن الكلمات التي تحتوي على جميع الأحرف المعطاة في أي موضع داخل الكلمة:

    sql
    SELECT * FROM your_table WHERE your_column REGEXP '^[^V]*V[^VW]*W[^W]*$'

    في هذا الاستعلام:

    • ^ يعني بداية الكلمة.
    • [^V]* يعني أي عدد من الأحرف التي ليست “V”.
    • V يعني الحرف “V” نفسه.
    • [^VW]* يعني أي عدد من الأحرف التي ليست “V” أو “W”.
    • W يعني الحرف “W” نفسه.
    • [^W]* يعني أي عدد من الأحرف التي ليست “W”.
    • $ يعني نهاية الكلمة.

    هذا الاستعلام سيبحث في الأعمدة المحددة (your_column) في الجدول المحدد (your_table) للكلمات التي تحتوي على الأحرف المعطاة بأي ترتيب داخل الكلمة. يمكنك استبدال “V” و “W” بالأحرف التي تريد البحث عنها. وبالطبع، يجب تغيير اسم الجدول واسم العمود وفقًا لبياناتك الفعلية.

    المزيد من المعلومات

    بالطبع، سأكمل المقال بتوضيح بعض النقاط الإضافية حول كيفية استخدام تعبيرات البحث والتعبيرات العادية في SQL لمطابقة الكلمات بناءً على الشروط المحددة.

    تعبيرات الانتقاء (Character Classes) في التعبيرات العادية (Regular Expressions) تسمح بتحديد مجموعات محتملة من الأحرف التي يمكن أن تظهر في موضع محدد في النص. على سبيل المثال، إذا كنت ترغب في البحث عن الكلمات التي تبدأ بـ “V” وتنتهي بـ “W”، يمكنك استخدام ^[V].*W$. هنا، ^ يعني بداية الكلمة، [V] يعني “V” في الموضع الأول، .* يعني أي عدد من الأحرف في أي موضع، و $ يعني نهاية الكلمة.

    ومن الجدير بالذكر أنه يمكن دمج تعبيرات الانتقاء مع التعبيرات العادية لزيادة دقة البحث. على سبيل المثال، يمكن استخدام [^VW] للبحث عن أي حرف آخر غير “V” و “W” في موضع محدد.

    إذا كانت قاعدة البيانات التي تستخدمها تدعم تعبيرات الانتقاء والتعبيرات العادية، يمكنك استخدامها لتنفيذ البحث بشكل أكثر دقة ومرونة. ومن الضروري التحقق من الدعم في النظام الذي تستخدمه، حيث قد لا تدعم جميع قواعد البيانات تلك الوظيفة بنفس الطريقة أو بنفس القدر من الكفاءة.

    بالنهاية، يتعين عليك أن تحدد الاستعلامات المناسبة وفقًا لمتطلباتك الخاصة ونوع قاعدة البيانات التي تستخدمها. ويمكنك دائمًا استشارة الوثائق الخاصة بقاعدة البيانات للحصول على مزيد من التفاصيل حول كيفية استخدام تعبيرات البحث والتعبيرات العادية في بيئتك المحددة.

  • توجيه عدة APIs تحت موقع واحد باستخدام NGINX

    تتضمن مشكلتك في استخدام NGINX كخادم وكبديل مسبق للطلبات (Reverse Proxy) توجيه طلبات متعددة لعدة API على منافذ مختلفة تحت موقع واحد. تريد تشغيل جميع هذه الAPIs تحت موقع واحد هو localhost:443/api/. هذا يشمل API العملاء على خادمين مختلفين، وهو ما يعقد الأمور بالنسبة لك.

    للتعامل مع هذا السيناريو، يمكنك تعديل إعدادات NGINX لتحقيق الهدف المطلوب. السبيل الذي اقترحه هو استخدام تعبيرات العنوان (regex) في موقع المكان لتطابق الطلبات بشكل ديناميكي. إليك كيف يمكنك تعديل إعدادات NGINX الخاصة بك:

    nginx
    server { listen 443; server_name localhost; location ~ ^/api/orders { proxy_pass https://localhost:500; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location ~ ^/api/customers/(?\d+)/billing { proxy_pass https://localhost:400/api/customers/$id/billing; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location ~ ^/api/customers { proxy_pass https://localhost:300; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } }

    في هذا التكوين، تستخدم تعبيرات العنوان لتحديد المواقع التي تخص كل API. بدلاً من تحديد مسارات محددة مثل /api/orders أو /api/customers/$id/billing، يمكنك استخدام ^ للبداية و$ للنهاية مع تعبيرات العنوان للتأكد من أن المسارات تطابق بالضبط.

    على سبيل المثال، الموقع ~ ^/api/orders سيتطابق مع أي مسار يبدأ بـ /api/orders ولكن لا يوجد لديه قيد للنهاية، مما يعني أنه سيتطابق مع كل ما بعد /api/orders بغض النظر عن ما يكون.

    أما بالنسبة لـ /api/customers/(?\d+)/billing، فهو يستخدم تعبيرًا عن العنوان لالتقاط قيمة الـ id من المسار. هذا يتيح لك توجيه الطلبات بناءً على القيم المحددة في مسار العنوان.

    باستخدام هذا التكوين، يجب أن تكون قادرًا على تحقيق ما تريد، وهو توجيه الطلبات لجميع الـ APIs المذكورة تحت موقع واحد وهو localhost:443/api/.

    المزيد من المعلومات

    بالطبع، دعني أواصل تطوير المقال لمساعدتك في فهم هذا العملية بشكل أفضل وتنفيذها بنجاح.

    بعد تعديل إعدادات NGINX كما سبق، يجب أن تكون قادرًا الآن على توجيه جميع الطلبات المتعلقة بالـ APIs المختلفة تحت الموقع الواحد localhost:443/api/. دعنا نلقي نظرة عميقة على التعديلات التي أجريناها وكيف تؤثر على سير العمل:

    1. مطابقة المواقع باستخدام تعبيرات العنوان (Regex Matching):
      استخدمنا تعبيرات العنوان لتحديد المواقع التي يجب أن تتم مطابقتها لكل API. هذا يسمح لنا بالتعامل مع مسارات الطلبات بشكل ديناميكي بدلاً من تحديد مسارات ثابتة.

    2. توجيه الطلبات إلى المنافذ الصحيحة:
      بعد تحديد المواقع المناسبة لكل API، استخدمنا proxy_pass لتوجيه الطلبات إلى المنافذ الصحيحة لكل API. على سبيل المثال، توجيه الطلبات المتعلقة بـ orders إلى المنفذ 500، والطلبات المتعلقة بـ customers إلى المنفذ 300، والطلبات المتعلقة بـ billing إلى المنفذ 400.

    3. تعيين رؤوس الطلبات الخاصة:
      استخدمنا proxy_set_header لتعيين رؤوس الطلبات بشكل صحيح. هذا مهم للحفاظ على سلامة الطلبات والردود أثناء التوجيه.

    بعد تطبيق هذه التعديلات، يجب أن يعمل NGINX بشكل صحيح لتوجيه الطلبات لجميع الـ APIs المختلفة تحت موقع واحد. لا تنسى إعادة تشغيل NGINX بعد تعديل إعداداته لتأكيد تطبيق التغييرات.

    إذا واجهت أي مشكلة أو كان لديك أي استفسار إضافي، فلا تتردد في طرحه هنا أو في المنتديات ذات الصلة. سنكون سعداء بمساعدتك في الوصول إلى الحل الأمثل.

  • استعلامات Laravel: بناء استعلامات قوية

    الاستعلام الذي تحاول صياغته في Laravel يبدو واعدًا، حيث تحتاج إلى استعلام يستخدم العديد من الشروط مع عمليات مختلفة مثل AND و OR، بالإضافة إلى استخدام عملية LIKE للبحث في نص محدد. في هذه الحالة، تريد البحث عن السجلات التي تحتوي على كلمات مفتاحية معينة في حقل محدد.

    لديك بالفعل جزء من الاستعلام الذي يبدو جيدًا، ولكن الجزء الذي يتعلق بالـLIKE يحتاج إلى تعديل بسيط لضمان عمل البحث بالشكل المطلوب. في الوقت الحالي، يبدو أنك تستخدم orWhere مع مصفوفة تحتوي على قيم متكررة لنفس المفتاح، وهذا لن يؤدي إلى النتائج المطلوبة.

    لتنفيذ عملية الـLIKE بشكل صحيح، يجب تغيير طريقة تكوين المصفوفة التي تمررها إلى الـorWhere لتضمن وجود عمليات LIKE. يمكنك استخدام الدالة where مع إعدادات مخصصة لتحقيق ذلك.

    إليك كيفية تحسين الجزء المعني من الاستعلام:

    php
    $todaysReferrals = DB::table('link') ->join('daily_link', 'link.lnk_id', '=', 'daily_link.dlk_lnkid') ->join('demographic', 'link.lnk_dmgid', '=', 'demographic.dmg_id') ->join('admission', 'link.lnk_admid', '=', 'admission.adm_id') ->join('or_call', 'admission.adm_calid', '=', 'or_call.cal_id') ->join('admission_score', 'admission.adm_scoreid', '=', 'admission_score.ascore_id') ->join('diagnosis', 'link.lnk_dgnid', '=', 'diagnosis.dgn_id') ->join('outcome', 'link.lnk_otcid', '=', 'outcome.otc_id') ->where($matchThese) ->where(function($query) use ($orThose) { $query->where('outcome.otc_outcome', 'LIKE', '%ICU%') ->orWhere('outcome.otc_outcome', 'LIKE', '%I.C.U%'); }) ->get();

    في هذا التحسين، قمنا بتضمين دالة where مع استخدام LIKE للبحث عن الكلمات المفتاحية المحتملة. باستخدام الدالة المتعددة orWhere داخل الدالة where، يتم تضمين الشروط المطلوبة بينها بشكل صحيح للبحث عن الكلمات المفتاحية في الحقل المعني.

    بعد تطبيق هذا التعديل، يجب أن يعمل الاستعلام بشكل صحيح ويعيد النتائج المتوقعة التي تحتوي على الكلمات المفتاحية المحددة في حقل outcome.otc_outcome.

    المزيد من المعلومات

    بالطبع، لنستمر في توسيع المقال لإضافة معلومات إضافية حول الاستعلام وتفسير كيف يعمل وماذا يعني كل جزء منه.

    عند بناء الاستعلام في Laravel، يتعين عليك فهم الأساسيات حول كيفية تشكيل الشروط والمعاملات المختلفة. في الاستعلام الذي تقوم ببنائه، تستخدم العديد من الشروط مثل JOIN لربط الجداول معًا و WHERE لتحديد الشروط التي يجب تلبيتها. بالإضافة إلى ذلك، تستخدم orWhere لتحديد شروط إضافية تجمع بينها بواسطة OR.

    في جزء الاستعلام الذي يتعلق بالـLIKE، يبحث Laravel عن السجلات التي تحتوي على الكلمات المحددة في حقل outcome.otc_outcome. باستخدام % قبل وبعد الكلمات المفتاحية في LIKE، يعني أنه يجب أن تظهر الكلمة في أي مكان داخل النص، لذا لو وجدت ICU أو I.C.U في أي مكان في النص، فإن السجل سيكون مطابقًا.

    من المهم أن تتأكد من ترتيب الشروط بشكل صحيح، حيث أن استخدام الدوال المتعددة مثل where داخل دوال أخرى يمكن أن يحدد ترتيب تقييدات البحث وفقًا للمنطق المناسب.

    باستخدام هذه الإرشادات وفهم الأساسيات، يمكنك بناء استعلامات قوية وفعالة في Laravel للبحث واسترجاع البيانات بشكل دقيق وفعال، مما يسهم في تحسين أداء تطبيقاتك وجعلها أكثر فاعلية.

  • البحث عن عناصر داخل عناصر باستخدام jQuery

    للعثور على أقرب عنصر “span” ذو الصنف “error_span” داخل عنصر “div” معين باستخدام jQuery، يمكن استخدام الدالة closest() بالتنسيق التالي:

    javascript
    $(document).ready(function(){ $("#reimburse_price").change(function(){ var closestErrorSpan = $(this).closest(".form-group").find(".error_span"); // الآن يمكنك استخدام closestErrorSpan بحرية للقيام بالإجراءات المطلوبة مثل إظهار رسالة الخطأ أو تغيير النمط أو أي عمل آخر. }); });

    في هذا الشفرة، يتم تطبيق دالة closest() للعثور على أقرب عنصر “div” ذي الصنف “.form-group” الذي يحتوي على العنصر “#reimburse_price” (الذي تم التغيير عليه). بمجرد العثور على هذا العنصر “div”، يتم استخدام دالة find() للبحث داخله عن العنصر “span” ذو الصنف “.error_span”.

    بهذه الطريقة، يمكنك الآن القيام بالإجراءات المطلوبة على العنصر “span” الذي تم العثور عليه، مثل عرض رسالة الخطأ أو إجراء أي تغيير آخر في الواجهة الخاصة بك.

    المزيد من المعلومات

    عند تطوير تطبيقات الويب، يمكن أن يكون من الضروري البحث عن العناصر داخل عناصر أخرى بشكل ديناميكي. قد يكون من الأمثلة على ذلك الرغبة في العثور على عنصر محدد داخل عنصر والقيام بإجراءات معينة عليه، مثل تغيير النمط أو عرض رسالة خطأ. في هذا المثال، سنتعلم كيفية استخدام jQuery للبحث عن العناصر بشكل ديناميكي داخل عناصر أخرى.

    أولاً وقبل كل شيء، دعونا نفهم الهيكل الذي سنعمل عليه. لدينا عنصر “div” يحتوي على حقل إدخال “input” وعنصر “span” لعرض رسالة الخطأ. يبدو الهيكل التالي:

    html
    <div class="form-group row"> <div class="col-sm-4"><label for="reimburse_price" class="control label">Amountlabel>div> <div class="col-sm-8"> <div><input type="text" name="reimburse_price" min="1" placeholder='0.00' class="form-control numberOnly" id="reimburse_price" required>div> <div><span class="small text-danger error_span">span>div> div> div>

    الآن، لنتعلم كيفية استخدام jQuery للبحث عن العنصر “span” ذو الصنف “error_span” داخل هذا الهيكل. نحتاج إلى اتباع الخطوات التالية:

    1. ربط jQuery بصفحتنا.
    2. كتابة الكود اللازم للبحث عن العنصر المطلوب.
    3. تنفيذ الإجراءات المطلوبة على العنصر الذي تم العثور عليه.

    الآن، سنقوم بتنفيذ الخطوات السابقة في شفرة jQuery:

    javascript
    $(document).ready(function(){ // عند تغيير قيمة الحقل "reimburse_price" $("#reimburse_price").change(function(){ // البحث عن العنصر "span" ذو الصنف ".error_span" داخل العنصر "div" ذو الصنف ".form-group" الأقرب var closestErrorSpan = $(this).closest(".form-group").find(".error_span"); // الآن يمكنك استخدام closestErrorSpan بحرية للقيام بالإجراءات المطلوبة // مثل إظهار رسالة الخطأ أو تغيير النمط أو أي عمل آخر. }); });

    مع تنفيذ هذا الكود، سيتم الآن البحث عن العنصر “span” ذو الصنف “.error_span” داخل العنصر “div” ذو الصنف “.form-group” الأقرب لحقل الإدخال “reimburse_price”. ومن ثم، يمكنك تنفيذ الإجراءات المطلوبة على هذا العنصر المحدد، مثل عرض رسالة الخطأ أو إجراء تغييرات أخرى بناءً على متطلبات تطبيقك.

    بهذا، يمكنك الآن استخدام jQuery بشكل فعال للبحث عن العناصر داخل عناصر أخرى بطريقة ديناميكية وتنفيذ الإجراءات المطلوبة عليها.

  • مطابقة القوائم المتزايدة باستخدام Regex

    باستخدام تعبيرات العبارات النمطية (Regex)، يمكننا بناء نمط يتوافق مع القوائم التي تحتوي على أرقام صحيحة معزولة مفصولة بفواصل، حيث يزيد كل عنصر عن العنصر السابق بمقدار واحد. للقيام بذلك، يمكن استخدام التالي:

    regex
    ^(0|([1-9]\d*))(,(?=\1$)|,(?=\1(?!$))(0|([1-9]\d*)))?$

    الآن، سأشرح هذا النمط خطوة بخطوة:

    1. ^ يعني بداية السلسلة.
    2. (0|([1-9]\d*)) تحدد مجموعة من الأرقام. إما أن يكون الرقم صفر (0)، أو رقم صحيح يبدأ بغير صفر (1-9) ويتبعه أي عدد من الأرقام الصحيحة (0-9).
    3. (,?((?=\1$)(0|([1-9]\d*))))? يحدد الفاصلة والعدد الذي يأتي بعدها إذا كان هناك. يحتوي هذا الجزء على علامة فاصلة متبوعة بـ:
      • (?=\1$) ضمنية تتأكد من أن العدد اللاحق هو الرقم التالي في السلسلة. يتم ذلك عن طريق المطابقة للعدد السابق (الذي تم تخزينه في \1) مع نهاية السلسلة.
      • (0|([1-9]\d*)) تعيين آخر للأرقام كما هو مذكور أعلاه.

    بهذا النمط، يمكن استبعاد القوائم التي لا تتوافق مع الزيادة التسلسلية للأرقام. والآن بعد شرح النمط، يمكنك استخدامه في برمجتك أو تطبيقه في أي سياق يتطلب مطابقة القوائم المتزايدة بأرقام صحيحة.

    المزيد من المعلومات

    بالطبع، سأكمل المقال بالتعمق في شرح كيفية فهم واستخدام هذا النمط في لغة تعبيرات العبارات النمطية (Regex) لمطابقة القوائم التي تتزايد بأرقام صحيحة.

    فهم النمط:

    1. ^ يعني بداية السلسلة.
    2. (0|([1-9]\d*)) تحدد مجموعة من الأرقام. إما أن يكون الرقم صفر (0)، أو رقم صحيح يبدأ بغير صفر (1-9) ويتبعه أي عدد من الأرقام الصحيحة (0-9).
    3. (,?((?=\1$)(0|([1-9]\d*))))? يحدد الفاصلة والعدد الذي يأتي بعدها إذا كان هناك. يحتوي هذا الجزء على علامة فاصلة متبوعة بـ:
      • (?=\1$) ضمنية تتأكد من أن العدد اللاحق هو الرقم التالي في السلسلة. يتم ذلك عن طريق المطابقة للعدد السابق (الذي تم تخزينه في \1) مع نهاية السلسلة.
      • (0|([1-9]\d*)) تعيين آخر للأرقام كما هو مذكور أعلاه.
    4. $ يعني نهاية السلسلة.

    كيفية استخدام النمط:

    يمكن استخدام هذا النمط في أي برنامج أو محرر يدعم تطبيق تعابير العبارات النمطية مثل Python باستخدام مكتبة re، أو في محرر نصوص متقدم مثل Sublime Text أو Visual Studio Code.

    قد يكون استخدام النمط كما يلي في Python:

    python
    import re pattern = r"^(0|([1-9]\d*))(,(?=\1$)|,(?=\1(?!$))(0|([1-9]\d*)))?$" lists = [ "0,1,2,3", "8,9,10,11", "1999,2000,2001", "99,100,101", "42", "3,2,1", "1,2,4", "10,11,13" ] for lst in lists: if re.match(pattern, lst): print(f"{lst}: Matches") else: print(f"{lst}: Does not match")

    ختامًا:

    باستخدام هذا النمط، يمكنك بسهولة مطابقة القوائم التي تتزايد بأرقام صحيحة، مما يسهل عملية فحص البيانات المدخلة وضمان صحتها وتمييزها عن البيانات التي لا تتبع نفس الزيادة التسلسلية. تذكر دائمًا أن فهم وتعديل تعابير العبارات النمطية يتطلب ممارسة واستكشاف مستمر للوظائف المختلفة التي توفرها.

  • استخراج الفروع بين شرطتين في جافا

    للحصول على جميع حالات الظهور للمقاطع الفرعية بين حرفين معينين في سلسلة نصية في لغة البرمجة جافا، يمكنك استخدام تعبيرات القوالب (Regular Expressions) لتحديد النمط المطلوب ثم استخدام الدالة المناسبة لإيجاد الفروع المطابقة.

    في هذا السياق، يمكنك استخدام الدالة Pattern.matcher() لإيجاد جميع الفروع المطابقة في السلسلة النصية، وبعد ذلك يمكنك استخدام الدالة Matcher.find() للعثور على كل حالة ظهور.

    فيما يلي مثال على كيفية تنفيذ هذا في جافا:

    java
    import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String text = "/Math/Math1/Algerbra/node"; String regex = "/([^/]+)/"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); StringBuilder result = new StringBuilder(); while (matcher.find()) { result.append(matcher.group(1)).append("-"); } // Remove the trailing dash if (result.length() > 0) { result.setLength(result.length() - 1); } System.out.println(result.toString()); // Output: Math-Math1-Algerbra } }

    في هذا المثال، يتم استخدام تعبير القالب /([^/]+)/ حيث يتم تطابق أي نص بين الشرطتين / و / ويتم استخراج النص بينهما باستخدام المجموعة المحاطة بقوسين.

    بعد ذلك، يتم استخدام حلقة while لتمرير جميع الفروع المطابقة، وتتم إضافة كل فرع إلى StringBuilder ويتم فصلها بواسطة الشرطة -. في النهاية، يتم إزالة الشرطة الزائدة في نهاية الناتج.

    هذا الكود سيُخرج الناتج المطلوب “Math-Math1-Algerbra” استنادًا إلى السلسلة النصية المعطاة.

    المزيد من المعلومات

    بالطبع، دعني أوضح بعض المعلومات الإضافية حول الكود وكيفية عمله:

    1. تعبير القالب (Regex):

      • في التعبير "/([^/]+)/", تبدأ السلسلة بشرطة / وتنتهي بشرطة /.
      • [^/] تعني “أي شيء غير شرطة”.
      • + تعني “واحد أو أكثر”، لذا فإن ([^/]+) يعني “أي مجموعة من الأحرف غير الشرطة تحتوي على حرف واحد على الأقل”.
      • المجموعة داخل القوسين () تسمح بالتقاط المطابقة لاحقًا باستخدام matcher.group(1).
    2. Pattern و Matcher:

      • يستخدم الكود Pattern.compile(regex) لتحويل التعبير القالبي إلى كائن Pattern يمكن استخدامه للتحقق من التطابق في السلاسل النصية.
      • ثم يتم استخدام pattern.matcher(text) لإنشاء كائن Matcher يحتوي على السلسلة النصية التي يجب التحقق منها.
    3. البحث عن التطابقات:

      • يتم استخدام حلقة while (matcher.find()) لتكرار البحث عن التطابقات داخل النص الأصلي.
      • matcher.find() تقوم بإجراء بحث جديد عن التطابقات في كل دورة من الحلقة، وتعيد true إذا وُجد تطابق جديد و false إذا انتهى البحث.
    4. استخراج النتائج:

      • باستخدام matcher.group(1)، يتم استرجاع المجموعة المطابقة (النص بين الشرطتين) في كل مرة يتم فيها العثور على تطابق.
      • يتم إضافة هذه النصوص المستخرجة إلى StringBuilder وتفصل بشرطة -.
    5. إزالة الشرطة الزائدة:

      • في النهاية، يتم إزالة الشرطة الزائدة في نهاية الناتج باستخدام result.setLength(result.length() - 1)، حيث يتم تقليص طول السلسلة بمقدار واحد لإزالة الشرطة الزائدة.

    باستخدام هذه الخطوات، يمكنك استخراج جميع الفروع المطابقة بين الشرطتين في السلسلة النصية المعطاة بنجاح.

  • مطابقة الصور في Java

    لمطابقة الصور المتشابهة في Java، يمكنك استخدام مكتبة معالجة الصور المتاحة مثل OpenCV أو Java Advanced Imaging (JAI). في هذا السياق، يمكنك استخدام خوارزميات مطابقة النمط (Pattern Matching) للبحث عن صورة صغيرة (B) داخل صورة أكبر (A).

    الخطوات الأساسية لتحقيق ذلك هي:

    1. قراءة الصور A و B في Java.
    2. استخدام خوارزمية مطابقة النمط (مثل Template Matching) للبحث عن صورة B داخل صورة A.
    3. تحديد ما إذا كانت الصورتان متطابقتين بناءً على نتائج عملية المطابقة.

    إليك مثال بسيط باستخدام OpenCV لمقارنة الصور:

    java
    import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.core.CvType; import org.opencv.core.MatOfByte; import org.opencv.core.MatOfPoint2f; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import java.util.List; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.ByteArrayInputStream; import java.io.InputStream; public class ImageMatcher { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // Load images Mat img1 = Imgcodecs.imread("path/to/image/A.jpg"); Mat img2 = Imgcodecs.imread("path/to/image/B.jpg"); // Convert images to grayscale Mat grayImg1 = new Mat(); Mat grayImg2 = new Mat(); Imgproc.cvtColor(img1, grayImg1, Imgproc.COLOR_BGR2GRAY); Imgproc.cvtColor(img2, grayImg2, Imgproc.COLOR_BGR2GRAY); // Use Template Matching to find img2 in img1 Mat result = new Mat(); Imgproc.matchTemplate(grayImg1, grayImg2, result, Imgproc.TM_CCOEFF_NORMED); // Find best match location Core.MinMaxLocResult mmr = Core.minMaxLoc(result); Point matchLoc = mmr.maxLoc; // Draw rectangle around the match Imgproc.rectangle(img1, matchLoc, new Point(matchLoc.x + img2.cols(), matchLoc.y + img2.rows()), new Scalar(0, 255, 0), 2); // Save the result image Imgcodecs.imwrite("path/to/output.jpg", img1); } }

    يرجى ملاحظة أن هذا مثال بسيط وقد يحتاج إلى تعديل ليتناسب مع احتياجاتك الدقيقة. كما يجب توفير مكتبة OpenCV وضبط مسارات الصور المطابقة في الكود.

    تذكر أن مقارنة الصور الكبيرة بالصور الصغيرة يمكن أن تكون عملية مكلفة من حيث الموارد، لذا يجب أن تكون حذرًا في استخدام هذه الطريقة في تطبيقاتك.

    المزيد من المعلومات

    لمزيد من المعلومات حول موضوع مطابقة الصور في Java، يمكنك النظر في النقاط التالية:

    1. أنواع خوارزميات مطابقة النمط: توجد عدة أنواع من خوارزميات مطابقة النمط تستخدم لمقارنة الصور، مثل:

      • خوارزمية القالب (Template Matching): تستخدم للبحث عن صورة صغيرة داخل صورة أكبر. تقوم الخوارزمية بتحريك الصورة الصغيرة (النمط) عبر الصورة الأكبر وتحسب درجة التشابه في كل نقطة.
      • خوارزمية الهاش (Hashing Algorithms): تقوم بتوليد “بصمة” (Hash) للصورة تستخدم لمقارنتها مع بصمات الصور الأخرى. إذا كانت البصمتان متطابقتان، فإن الصورتان متطابقتان.
      • خوارزمية تحويل فورييه السريع (Fast Fourier Transform – FFT): تستخدم لتحويل الصور إلى مجال الترددات لمقارنتها في هذا المجال.
    2. تحسين أداء مطابقة الصور: لتحسين أداء مطابقة الصور، يمكنك اتباع الإرشادات التالية:

      • استخدام صور ذات جودة منخفضة لمطابقة النمط.
      • استخدام خوارزميات مطابقة النمط الفعالة مثل FFT.
      • استخدام تقنيات التحسين مثل تقليل الحجم والتقريب لتقليل التعقيد الزمني.
    3. ملاحظات الأمان: قد تحتاج إلى مراعاة الأمان عند مطابقة الصور، خاصة إذا كانت الصور تحتوي على معلومات حساسة. تأكد من اتخاذ إجراءات لحماية الصور ومعالجتها بشكل آمن.

    4. استخدام OpenCV: إذا كنت تستخدم OpenCV، يمكنك العثور على العديد من الموارد والأمثلة على الإنترنت التي توضح كيفية استخدامها لمطابقة الصور.

    5. تطبيقات مطابقة الصور: يمكن استخدام مطابقة الصور في العديد من التطبيقات مثل التعرف على الوجوه، والتعرف على الأشياء، والبحث عن النصوص في الصور، والكشف عن التغييرات في الصور.

    باختصار، مطابقة الصور تمثل تحديًا مثيرًا للاهتمام في علم الحوسبة البصرية، ويمكنك استخدام مكتبات مثل OpenCV لتنفيذها بكفاءة في Java.

  • تحسين الوصلات في Ruby باستخدام Regex

    في لغة Ruby، يمكنك تحقيق هذا الهدف باستخدام تعبيرات القوالب (regex) ووظائف معالجة النصوص المتاحة. يتيح لنا ذلك تطبيق أسلوب برمجي لإضافة النمط المحدد إلى كل وصلة.

    أولاً وقبل البداية في تطبيق الحلاقة البرمجية، يجب علينا فهم كيف يعمل النص الذي نريد تعديله. في السياق الحالي، لدينا نص HTML مضمن في سلسلة Ruby، ويرغب المستخدم في إضافة سلسلة النمط (style) إلى كل وصلة في النص.

    للقيام بذلك، يمكننا استخدام تعبيرات القوالب للبحث عن الوصلات في النص. يمكن استخدام الكود التالي:

    ruby
    str = "This website is <a href='www.google.com'>Google</a>, some other website is <a href='www.facebook.com'>Facebook</a>" style_to_add = "style='text-decoration:none;'" # تعريف نمط الوصلة link_pattern = /<a href='([^']+)'>([^&]+)<\/a>/ # البحث عن جميع الوصلات المطابقة matches = str.scan(link_pattern) # التحقق مما إذا كانت هناك وصلات مطابقة if matches.any? # عند وجود وصلات، قم بتحديث النص matches.each do |match| original_link = match[0] link_text = match[1] new_link = "#{style_to_add}>#{link_text}" str.sub!(link_pattern, new_link) end end puts str

    هذا الكود يستخدم تعبيرات القوالب للبحث عن الوصلات في النص، وبعد ذلك يقوم بتحديث النص لإضافة النمط المحدد إلى كل وصلة. يجب على المبرمج أن يضيف المزيد من التحسينات حسب حاجة التطبيق الفعلي، مثل التعامل مع تنسيقات وصلات مختلفة.

    المزيد من المعلومات

    في سياق استخدام لغة Ruby، يظهر أنك ترغب في إضافة سلسلة نصية محددة إلى كل رابط في سلسلة نصية معينة. يمكن تحقيق هذا الهدف باستخدام تعابير الريجكس (Regex) ووظائف Ruby المتقدمة.

    أولاً وقبل البدء في التفاصيل الفنية، يجب عليك استخدام تعبيرات الريجكس للعثور على جميع الروابط في النص الأصلي. في هذه الحالة، يمكننا استخدام التعبير العادي (Regex) للعثور على الوصلات داخل العلامات .

    بعد العثور على جميع الروابط، يمكنك استخدام حلقة لتحديد كل رابط على حدة وإضافة النص المطلوب. في هذه الحالة، سنقوم بتحديد الجزء المطلوب من الرابط وإضافة النص المحدد إليه.

    ruby
    matches.each do |match| link = match[0] modified_link = link.gsub(">", " #{style_to_add}>") str.gsub!(link, modified_link) end

    الآن، بعد تنفيذ الشيفرة أعلاه، سيتم إضافة النص المحدد إلى كل رابط في السلسلة الأصلية. يمكنك استخدام متغير str بعد التعديل للحصول على النتيجة المطلوبة.

    هذا النهج يوفر لك القدرة على تخصيص تعديلات النص وتطبيقها على كل رابط على حدة في Ruby، مع الحفاظ على النص الأصلي بشكل كامل.

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر