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

محمد ربيع زليول

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

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

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

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

    18

أجوبة بواسطة محمد ربيع زليول

  1. بتاريخ 3 ساعات قال Mohammed Abu Yousef:

    - هل أفهم من جوابك أن التطبيق فقط يحتاج استضافة للباك اند ( API )، وغير محتاج لاستضافة لتطبيق الموبايل ( أي أنه بعد عمل تطبيق الموبايل وربطه بال API، المطلوب فقط رفع التطبيق على المتجر فقط ؟ )

    نعم جانب الخادم سيحتوي على الواجهة البرمجية فقط API، وتطبيق الجوال يتم رفعه على متاجر التطبيقات ( جوجل بلاي، آبل ستور ).

    اقتباس

    لم أفهم تكاليف خرائط جوجل بشكل جيد، فهمت ما يخص سعر الطلب وهذه الأمور، لكن عند إطلاق التطبيق، على أي أساس ستعمل الخرائط، هل ستعمل فقط في حال كان هناك مال في الحساب المربوط بالخرائط، وفي حال انتهى المال، ستتوقف الخرائط عن العمل بشكل مباشر ؟

    غير متأكد من الموضوع لكني أعتقد أن السيناريو كالتالي:

    • عند إنشاء حساب مطور على جوجل يجب توصيل الحساب بالبطاقة البنكية.
    • بعد إنتهاء الشهر في حالة:
      • كان الرصيد الإجمالي أكبر من الحد المجاني الأقصى ( أعتقد 200$ ) لن يتم الإقتطاع
      • في حال الرصيد الإجمالي أكبر من الحد المجاني الأقصى سيتم اقتطاع المبلغ من البطاقة
    اقتباس

    - التطبيق، سيضع المستخدم marker حتى تعلم الناس مكانه وما هي الخدمة التي يقدمها، بناء على هذه الوظيفة، ما هي أنواع الخرائط التي أحتاجها؟

    في الغالب إحدى الخدمات التالية:

    • Mobile Native Dynamic Maps
    • Dynamic Maps
  2. بتاريخ On 2/26/2021 at 16:20 قال Mohammed Abu Yousef:

    لكن سؤالي كان عن الأسعار ( خاصة سعر إضافة خرائط جوجل للتطبيق، كم تكلف؟ )

    كما أخبر الأخ وائل، لا يوجد سعر محدد لإستخدام خرائط جوجل، تعتمد خرائط جوحل على نضام Pay-as-you-go pricing في التسعير بحيث أن التكلفة مرتبطة بعدد الطلبات التي تقوم بها ونوعيتها ولا يوجد أي اشتراك شهري أو سنوي، ولأقرب الموضوع سأذكر لك المتغيرات التالية التي تأثر في التكلفة:

    • عدد الطلبات التي سترسلها إلى خادم جوجل: يقوم بجوجل بوضع تسعيرة معينة لكل طلب، فمثلًا لنقل أن كل طلب ب 1$، اذا تم ارسال 100 طلب ستكون التكلفة 100دولار واذا أرسلت 1000 ستكون التكلفة 1000 دولار وهكذا ( هذا مثال فقط، أغلى طلب تساوي قيمته 0.02 دولار، أما بقية الطلبات فثمنها 0.002 أو 0.007  )
    • نوعية الطلبات التي ستقوم بإرسالها: يحتوي جوجل على مجموعة من الخدمات، مثلًا:
      • الخرائط الثابتة Static Maps: وهي خدمة تقدم لك خريطة ثابتة على شكل صورة يمكن أن تضعها في <img /> في HTML مثلًا.
      • الخرائط الدينامكية Dynamic Maps: وهي خدمة تمكن من عرض خرائط ديناميكية، يمكن التفاعل معها، عن تكبير تصغير الخريطة، تغير شكلها ..
      • الإتجاهات Directions API: وتستطيع من خلالها طلب معلومات عن طريقة التوجه من نقطة معينة إلى أخرى.
      • Distance Matrix : تمكن من حساب مسافة بين نقطتين أو مجموعة من النقاط.
      • Places في حالة كنت تريد أن تقوم بعمل Autocomplete للبحث عن مكان أو عنوان ما.
      • ...

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

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

    بالنسبة لمشروعك ستستخدم في الغالب Dynamic Maps لعرض الخرائط، وأماكن الأشخاص كحد أدنى.

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

    هذه الرابط يحتوي على كافة التفاصيل المتعلقة بالتسعير. PRICING

    • أعجبني 2
  3. بتاريخ 59 دقائق مضت قال Ghiath Alkhatib:

    صورة بعد ارسال تظهر اكواد تنسيق و محتوى

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

    ما يجب عليك ان تقوم به هو التالي:

    بدل طباعة المحتوى بالشكل العادي كما تقوم بطباعته حاليًا ( على شكل نص string )، يجب عليك أن تقوم بعمل render لهذا النص وتحويله إلى HTML.

    سأقدم لك حلين للقيام بهذا:

    الحل الأول:

    عن طريق إستخدام الخاصية dangerouslySetInnerHTML.

    لنقل مثلًا أن الخاصية أو المتغير الذي يحتوي على هذه الأكواد التي أرسلها المحرر هو content.

    بدل كتابة الكود أسفله لعرض المحتوى:

    <div>
      {content}
    </div>

    يجب كتابة كود مشابه للكود التالي:

    <div dangerouslySetInnerHTML={{__html: content}} />

    الحل الثاني:

    يمكنك إستخدام بعض المكتبات التي تقوم بنفس الدور ( تحويل html على شكل نص string إلى عناصر HTML )، أذكر كمثال مكتبة html-react-parser

    التي يمكنك تثبيتها في مشروعك عن طريق الأمر:

    npm i html-react-parser

    ثم إستخدامه بالشكل التالي:

    import parse from 'html-react-parser';

    ثم:

    <div>
      {parse(content)}
    </div>

     

    • أعجبني 2
  4. المرجو مشاركة الكود الكامل ( الجزء الذي استخدمت فيه محرر tiny )، والطريقة التي اشتغلت بها لإستخدام محرر tiny.

    في الرابط التالي ستجد طريقة إستخدام محرر tiny مع تطبيق React، لا أعلم إن كنت قد استخدمت نفس الطريقة أم أنك اشتغلت بطريقة أخرى.

    أحتاج توضيحات أكثر حتى أستطيع مساعدتك، أيضًا أحتاج فهم ما الذي تقصده بإرسال المحتوى؟

    • أعجبني 1
  5. بتاريخ 1 دقيقة مضت قال Momen Gamal:

    انا خلصت الاساسيات وطبقت بس مش لوحد مع الفيديو وعوز اطور نفسي فيها واحد نصحني بلموقع ده بس المشكله مش عارف اطور نفسي فيها

    • يمكنك التطبيق عن طريق تقليد بعض المشاريع، أو متابعة دروس تشرح إنشاء مشاريع عن طريق لغة جافا سكربت.
    • أو كما يمكنك متابعة محاولة حل المسائل البرمجية بهذه المواقع، وبعد كم سؤال ستفهم قواعد حل المسائل وستبدأ بإنجازها، أود الإشارة لأن المسائل بهذه المواقع تختلف صعوبتها، هناك مسائل سهلة وأخرى متوسطة الصعوبة ومسائل متقدمة.
    • أعجبني 1
  6. بتاريخ الآن قال Momen Gamal:

    تنصحني بي ايه عشان افهم المسائل واتعمق اكتر في الجافا اسكريبت

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

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

    • أعجبني 1
  7. المشكلة هي أنك قمت بتحميل create-react-app بشكل global عن طريق الأمر التالي:

    npm install -g create-react-app

    هذا الأمر يقوم بتحميل نسخة إلى حاسوبك ويستخدمها عندما تقوم بكتابة أمر create-react-app، النسخة التي قمت بتحميلها سابقًا غير حديثة outdated.

    أنصحك بحذفه عن طريق الأمر التالي:

    npm uninstall -g create-react-app

    ثم بعد ذلك يمكنك إستخدام الأمر التالي لإنشاء المشروع:

    npx create-react-app my-app

    مع تغير my-app لإسم تطبيقك.

  8. بتاريخ الآن قال Momen Gamal:

    ده تحدي تاني معرفتش احله اسئله ملهاش معني ولا انا مش فهم

    أعتقد أن السبب الرئيسي هو أنك غير متعود على الطريقة التي تطرح بها الأسئلة في هذا النوع من المواقع.

    التحديات بهذه المواقع دائمًا تحتوي على هذه الأمور الثلاث:

    • نص المشكلة: وهو نص يشرح الإشكالية التي نحاول حلها في السؤال.
    • المدخلات: وهي المتغيرات التي يقدمها لك الموقع في البداية والتي عليك أن تقوم بإستخدامها للوصول للنتيجة، وغالبًا ستجدها في معاملات الدالة.
    • المخرج: هي القيمة التي عليك إرجاعها في آخر السؤال، وهي حل السؤال.
    • وستجد ضمن النص بعض القيود، أو الأمثلة التي تشرح أو تساعدك للوصول إلى الحل.

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

    في السؤال السابق مثلًا، كان الهذف هو تعلم طريقة إرجاع قيمة من الدالة، وفي السؤال الحالي شرح المعامل && في جافا سكربت.

    إذا رجعنا للسؤال السابق سنجد أن:

    • نص المشكلة: يتحدث عن الوصول للقيمة القصوى لضلع الثالث للمثلث.
    • المدخلات: هي side1 و side2 وهي طول ضلعين من المثلث، ونجدها أيضًا في معاملات الدالة:
    function nextEdge(side1, side2) {
    	
    }

    المخرج: هو طول الضلع الثالث وهو القيمة التي علينا الوصول إليها وإرجاعها في النهاية:

    return (side1 + side2) - 1

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

    • أعجبني 1
  9. يطلب السؤال حساب الطول الأقصى للضلع الثالث للمثلث.

    أي أنه يقوم بتقديم طول ضلعين من المثلث، وأنت عليك حساب أقصى طول ممكن للضلغ الثالث.

    السؤال قدم العلاقة التي يمكنك من خلالها حساب هذا الطول، وهي كالتالي:

    (side1 + side2) - 1

    وما يطلبه السؤال هو بإكمال الدالة التالية بحيث، تقوم بتطبيق العلاقة وإرجاع القيمة:

    function nextEdge(side1, side2) {
    	
    }

    المتغير side1 هو طول الضلع الأول.

    والمتغير side2 هو طول الضلع الثاني.

    ولنطبق العلاقة سنقوم بجمع الضلعين وإنقاص 1:

    function nextEdge(side1, side2) {
    	(side1 + side2) - 1
    }

    ثم بعد ذلك علينا إضافة return لإرجاع قيمة هذه المعادلة:

    function nextEdge(side1, side2) {
    	return (side1 + side2) - 1
    }

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

    وعلى العموم العلاقة كالتالي:

    إذا اعتبرنا أن side1 هو طول الضلع الأول، وأن side2 هو طول الضلع الثاني، وأن side2 أكبر من side1.

    فطول الضلع الثالث side3 دائمًا سيكون محصورًا بين القيمتين:

    • القيمة الأدنى: side2 - side1
    • القيمة القصوى side2 + side1

    بالشكل التالي:

    side2 - side1 < side3 < side1 + side2

     

    • أعجبني 1
  10. بتاريخ الآن قال حسام الجهني:

    لم تظهر دوراتي في الشريط 

    كما أخبرك الأخ @عبود سمير، يمكنك مراسلة الدعم الفني من خلال الرابط التالي: مركز المساعدة، إفتح تذكرة، وقم بطرح مشكلتك، وسيقوم فريق الدعم بمساعدتك في أقرب وقت ممكن.

     

  11. مرحبًا حسام،

    بعد شرائك للدورة، ستظهر لك القائمة العلوية بالشكل التالي:

    5f577b15c1398_image(3).jpg.ad14a5d088946af09167b5925d1948bf.jpg

    يجب عليك الضغط على دوراتي، وستظهر لك قائمة بالدورات.

    بعدها إختيار الدورة التي قمت بالتسجيل بها، وبدأ دراسة المسارات.

    أتمنى لك التوفيق.

  12. بتاريخ 17 دقائق مضت قال Wissal Wissou:

    هل يمكن التوضيح في اي جزء من الكود لي عندي  اضع هاته الكودات 

    يمكن وضع هذه الأكواد داخل الكود المسؤول على عملية الضغط على زر الإضافة Ajouter

    btn_Ajouter.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    	// يجب وضعه هنا
      }
    });

    بالشكل التالي مثلًا:

    btn_Ajouter.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    	// يجب وضعه هنا
      if(textField_1.getText().equals("") || textField_2.getText().equals("") || textField_3.getText().equals("") || textField_4.getText().equals("")){  
        return;
      }
      
      try {
        Integer.parseInt(textField_1.getText());
      } catch(NumberFormatException ex) {
        if(textField_1.getText().length() != 1) {
    		return;
        }
      }
      
      String Tache = textField_1.getText();
      
      try {
        Integer.parseInt(textField_3.getText());
      } catch(NumberFormatException ex) {
        if(textField_3.getText().length() != 1) {
    		return;
        }
      }
      
      String Precedent = textField_3.getText();
          
      try {
        Float.parseFloat(textField_2.getText());
        String Duree = textField_2.getText();
        
        
      } catch(NumberFormatException ex) {
        // إضهار رسالة خطأ
        return;
      }
      
      try {
        Float.parseFloat(textField_4.getText());
        String Cout = textField_4.getText();
      } catch(NumberFormatException ex) {
        // إضهار رسالة خطأ
        return;
      }
      
      
      String[] userInfo = { Tache, Duree, Precedent, Cout };
      model.addRow( userInfo );
    
      }
    });

     

    • أعجبني 1
  13. لجعل الخانة JTextField تقبل نوعًا معينًا فقط، يمكن التحقق أن القيمة الموجودة بهذه الخانة قابلة لتحويل لهذا النوع.

    مثلًا في حالة أردنا التحقق من أن JTextField تحتوي على رقم سنقوم بكتابة الكود التالي:

    try {
    
      int Tache = parseInt(textField_1.getText());
      
    
    } catch(NumberFormatException ex) {
      
      // إضهار رسالة خطأ
    	
    }

    بنفس الطريقة يمكن التحقق من أن الخانة تحتوي على قيمة من نوع float هكذا:

    try {
    
      int Tache = Float.parseFloat(textField_2.getText());
      
    
    } catch(NumberFormatException ex) {
    	// إظهار رسالة خطأ
    }

    أما بالنسبة للتحقق من أن الخانة JTextField تحتوي على حرف واحد فقط كالتالي:

    if(textField_1.getText().length() == 1) {
    	String Tache = textField_1.getText();
    } else {
    	// إظهار رسالة خطأ
    }

     

     

    • أعجبني 1
  14. من خلال قاعدة المعرفة، سؤال كيف أعدّل معلومات الخدمة مثل العنوان، الوصف، الصورة، نجد أنه يمكنك تعديل جميع معلومات الخدمة إلا معلومتين وهما:

    • عنوان الخدمة.
    • تصنيف /قسم الخدمة.

    كما نجد أنه يمكن تعديل تطويرات الخدمة ووصفها، أي انه يمكن تعديل سعر الخدمة المقدم لكن هناك ملاحظة في آخر الصفحة وهي كالتالي:

    اقتباس

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

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

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

    • أعجبني 1
  15. بتاريخ 6 دقائق مضت قال ملاك محمد:

    نعم انتهت المده لدي هل استطيع الاستفاده من وردبريس من خلال اضافه استضافه وتشغيل المدونه؟

    أنت الآن قد قمت بإستضافة مدونتك في موقع Wordpress.com، لا يجب عليك إضافة إستضافة أخرى، يمكنك تشغيل المدونة من خلال موقع Wordpress.com مباشرة.

  16. من خلال الموقع الرسمي للووردبريس، نجد التالي:

    اقتباس

    يمكن إلغاء منتجاتنا لاسترداد الأموال ضمن الأطر الزمنية التالية:

    • 30 يومًا – جميع عمليات الشراء وعمليات التجديد في الخطة (على سبيل المثال خطط المدون، والشخصية، والمميّزة، والأعمال، والتجارة الإلكترونية)
    • 96 ساعة لعمليات تسجيل النطاقات وتجديدها – ارجع إلى هذه الصفحة للحصول على مزيد من المعلومات حول عمليات إلغاء النطاقات
    • 30 يومًا من شراء خدمة النقل الموجَّه، أو بمجرد نقل الموقع (أيهما يحدث أولاً)
    • 30 يومًا من شراء تراخيص البريد الإلكتروني الخاصة بـ G-Suite والقوالب المميّزة
    • تكون جلسات الدعم المدفوعة قابلة للاسترداد قبل الانتهاء

    إذن يمكن إسترداد مالك ما دام أنه لم يمر 30 يومًا على إشتراكك في الخطة، ويمكن إسترجاع المال المتعلق بتسجيل إسم النطاق إن لم تمر مدة 96 ساعة.

    يمكنك إلغاء عملية الشراء من خلال صفحة إدارة عمليات الشراء.

    يمكنك الإطلاع على التفاصيل الكاملة من خلال الصفحة التالية: إدارة عمليات الشراء وعمليات التجديد وعمليات الإلغاء.

  17. SQL هي اختصارٌ للعبارة Structured Query Language (أي لغة الاستعلام البنوية)، وهي اللغة المستخدمة لإجراء عمليات على قواعد البيانات، لا يمكن إستخدام SQL مباشرة، بل يجب الإعتماد على إحدى أنظمة معالجة قواعد البيانات وهي التالية:

    • MySql
    • PostgresSql
    • Oracle
    • SQLite
    • SQL Server

    لكل نظام طريقة تحميل مختلفة:

     

    • أعجبني 1
  18. في حالة حصلت معك المشكلة عند ثتبيت مكتبة react-navigation، يجب عليك تحميل هذه الإعتماديات dependencies :

    expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view

    في حالة كنت قد قمت بالفعل بثتبيت هذه الإعتماديات، اتبع الخطوات التالية:

    • أغلق جميع الطرفيات terminals المرتبة ب expo
    • قم بحذف ملف package-lock.json
    • قم بحذف مجلد node_modules
    • ثم قم بكتابة الأمر npm install
    • وتشغيل expo عن طريق الأمر expo start -c

     

  19. بتاريخ الآن قال Ahmed Alhamdany:

    في حالة أدخل المستخدم يوزر صحيح والباسوورد خطا كيف يتم كتابة الكود ؟

    غالبًا لا نقوم بإخبار المستخدم أن إسم المستخدم صحيح وكلمة السر، أشياء متعلقة بالحماية، لكن إذا أردت القيام بها فالطريقة كالتالي:

    • أولًا تقوم بالبحث عن مستخدم في قاعدة البيانات عن مستخدم لديه الإسم المدخل في فورم تسجيل الدخول هكذا مثلًا:
    $stmt = $con->prepare("SELECT  * from users WHERE username_users = ? limit 1"); // قمت بالبحث بإسم المستخدم فقط
    $stmt->execute(array($user)); // قمت بالبحث بإسم المستخدم فقط
    $row = $stmt->fetch();
    $count = $stmt->rowcount();

    الكود التالي يرجع القيمة 1 إذا كان هناك مستخدم بهذا الإسم والقيمة 0 إذا لم يكون هناك إي مستخدم بهذا الإسم.

    إذن في حالة كانت القيمة 0 سنقوم بعرض رسالة الخطأ:

    if ($count == 0 ) {
    	echo "Username is wrong";
    } else {
    
    	// باقي الكود
    
    }

    وفي حالة كانت قيمة count تساوي 1، سنقوم بالتحقق من أن كلمة السر التي أدخلها المستخدم مطابقة لكلمة السر في قاعدة البيانات،

    • في حالة لم تكن مطابقة سنعرض رسالة خطأ
    • في حالة كنت متطابقة نقوم بالإنتقال لصفحة admin.php أو index.php
    if ($count == 0 ) {
    	echo "Username is wrong";
    } else {
    
    	if($hashpass != $row['password_users']) {
    		echo "Password is wrong"; // نقوم بعرض رسالة الباسورد خاطئ
    	} else {
    		// نقوم بتسجيل الدخول والإنتقال للصفحات
    
          $_SESSION['username'] = $user ; 
          $_SESSION['id'] = $row['id_users'];
          $_SESSION['types'] = $row['types_users'];
    
          if($_SESSION['types'] == 2 || $_SESSION['types'] == 3){
          	header('location: index.php');
          }
          if($_SESSION['types'] == 0 || $_SESSION['types'] == 1){
          	header('location: admin.php');
          }
    
    	}
    
    }

     

     

     

    • أعجبني 1
×
×
  • أضف...