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

Nuhla Almasri

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

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

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

كل منشورات العضو Nuhla Almasri

  1. هنا الخطأ ليس بالويب باك هل يمكنك ارسال الكود الخاص بكود اظهار الفيديو
  2. يمكنك إستخدام الريكيرجن و هو مبدأ ايضا يعادل looping او الدوران لكن بطرقة ممكن اكثر نوعية حيث أن شرط التوقف لا يعتمد على عدد النود او الرؤوس بل يعتمد على مثلا إن لم يتبقى تفرعات, أو أن محتوى هذه القيمة null اي غير موجوده هنا مثال بسيط عليها و يمكنك أن تستحدم شئ موازي لها و الأفضل استعمال الdebugger لفهم اكثر كيف يكون الأستدعاء فالحالة هنا ان الداية نفسها تستدعي نفسي طالما ان الشرط الدخلي للخروج لم يتحقق كالتالي // هنا نقوم بخلق دالة function countDown(fromNumber) { // هنا نقوم بوضع شرط التوقف و يمكن ان يكون اي شيء بحسب الحالة التي تريدها if(fromNumber===0)return ; //نفوم هنا بطباعة الرقم console.log(fromNumber); // اهم نقطة نقوم بإستدعاء الدالة مرة أخرى على قيمة جديدة و التي هي الرقم -1 فنمرر هنا قيمة جديدة لدالة جديدة countDown(fromNumber-1); } countDown(3); للعلم إن إستعمال الريكيرجن يقوم على إستدعاء الدالة أكثر من مرة و لكن كل دالة تحتوي على قيم لا علاقة لها بالدالة السابقة , يمكنك تخيل الموضوع انك كل مرة ترسم مربع له نفس الخصائص و لكنك تقوم بعمل نسخ منه و تخصيصه اي المدخلات و المخرجات مختلفة لكل مربع
  3. تمكّننا وحدة child_process من الوصول إلى وظائف نظام التشغيل عن طريق تشغيل أي أمر نظام داخل عملية فرعية و كما هو معروف فان النود هو Single Thread (ذو ترابط واحد فقط ) لذلك يمكننا تعزبز وضع عمل النود على الجهاز من خلال إستخدام مصادر الجهاز أو السيرفير مباشرة حيث يمكن إستخدام هذه الطريقة لعمل أوامر مباشرة عن طريق ال shell او command line للسيرفير و يمكنك من خلالها إجراء أي أمر بإستخدام واجهة الاوامر الكتابية Command Line و هنا مثال بسيط يمكنك من خلاله القيام بهذه العملية // تعريف لوحة اوامر const { exec } = require('child_process'); // هنا تقوم بتمرير الامر الى لوحة الاوامر و تنفيذها // هذه امر بسيط للبحث exec('find . -type f | wc -l', (err, stdout, stderr) => { if (err) { console.error(`exec error: ${err}`); return; } console.log(`Number of files ${stdout}`); });
  4. على حسب علمي فانه يجب ان تقوم بإزالة data:image/jpeg;base64, من الصورة حتى يتم كتابتها بالشكل الصحيح و من هذه المعلومات يمكنك حفظ نوع الصورة و لكن باقي البيانات هي المعلومات المهمة لكتابة صورة على شكل ملف لذلك يمكنك ازالة هذه الباينات بالطريقة التالية وبعد ذلك يمكنك حفظها كما فعلت سابقا // هنا تقوم بلزالة هذه البانات من الصورة var base64Data = req.rawBody.replace(/^data:image\/png;base64,/, "");
  5. Nodejs يعمل على ثريد واحد فقط لذلك يوجد شئ يدعى ثريد بول و هي جميع الأحداث مثل نقر و إرسال طلب لبيان معين أو خدمع معينها و لأن ال node ليس متعدد الثريد اي فقط يستحدم ثريد واحد فقد فان جميع العمليات الموجهة الى السيرفير سوف تكون داخل هذه الواحة او المكان و هناك يتم التعامل مع كل طلب بشكل منفرد حيث انة يقوم بمعالجة الاوامر بحيث كل امر سيطلب شيئ معين من السيرفير و يعطيه البيانات المعينة ثم يخرج و ينتظر السرفير حتى يقوم بإجراء ما يمكن و إرجاع المعلومات المطلوبة من هذا الطلب بما معناه ال thread pool آلية تحاكي ال multi Threading و لكن باستخدام ثريد واحد فقط من الجهاز الذي يقوم بعمل جميع العمليات و توصيل جميع الطلبات و إعادة إرسال جميع البيانات المراده من خلاله ييذكر هنا ان هذه العملية موصولة بمفهوم ال asuync بحيث ال العمليات sync لن يقوم معالج الجافا سكربت بالذهاب الى سطر الكود التالي الا بعد انتهائ هذه العملية أولا و إن أخذت وقتها أما النوع الأخر فهو async و هي العمليات التي يتم تنفيذها تزامنا مع إجراء عمليات أخرى بنفس الوقت لذى عند قراءة دالة من نوع async فان المعالج للجافا سكربت سيقوم بأجراء العملية و لكن لن ينتظر النتائج للذهاب الى السطر التالي من الكود او الأوامر و من هنا الThread pool هذا ما تقوم به فعليا تاخذ جميع الإحداث أو العمليات و تضعها في حيز التنفيذ و تطلب منها انتظار النتائج دون اعاقة للأوامر التالية
  6. this هي عبارة عن فقط مؤشر يؤشر على موقع الأوبجت الذي نحن داخله this لا تحتوي على اي شئ هي فقط مؤشر على موقع في الذاكرة يدل على موقع الاوبجت الذي نحن نقوم بعمل العمليات عليه حاليا بالنسبة var a = this; انت لست تقوم باي شيئ او انت لا تؤشر على اي شئ سوى البراوزر و لكن بوجود هذه الدالة في السيرفير فلن تحتوي على شيئ لانك لم تقم باستخدامها داخل دالة او داخل معرف class فهي لن تدل على شيئ اما بالنسبة var testFn = function() { var TThis = this; // "this" هنا تدل على الكائن العام الخاص بنود }; فهنا انت انت اقحمت هذا المؤشر داخل دالة بحيث سوف يقوم بالتاشير للشيئ الذي تقوم باجراء الدالة عليه و هو السيرفير او النود بشكل عام لأنه بالنهاية عبارة عن دالة معرفة او مجموعة من المكتبات التي تحتوي عدة تعريفات class
  7. يمكنك ان تقوم بعمل حالة مثل isButtonDisabled و عند الضغط عليه لأول مره عمل هذه الحالة false و عمل تحقق من هذه الحالة فإن كانت true سيقوم بالضغط عليه و إن كانت false لن يكون هناك اي onPress مما يعني انو الكبسة ستكون غير فعالة لعدم وجود دالة تقوم بعمل يشئ لهذه الكبسة كالتالي : class _MyHomePageState extends State<MyHomePage> { int _counter = 0; // هنا تقوم بتعريف الحالة bool _isButtonDisabled= True; //هنا بتعريق الدالة التي ستفوم بعمل الزيادة void _incrementCounter() { setState(() { _isButtonDisabled = true; _counter++; }); } ......................... Widget _buildCounterButton() { // هنا نقوم بتفقد الحالة // ان كانت True سنقوم بارجاع الدالة Increment لل onPeress // ان كانت False سنفوم بارجاع null // اعطاء فيمة نل للحدث يعني ان هذه الكبسة غير قابلة للكبس return new RaisedButton( child: new Text( _isButtonDisabled ? "Hold on..." : "Increment" ), onPressed: _isButtonDisabled ? _incrementCounter():null, ); }
  8. نعم صحيح حسنا يمكنك إستعمال شئ يسمى multi_image_picker و هي طريقة لتحميل عدة صورة بنفس الوقت دون الحاجة الى عمل اكثر من كبسةهنا يوجد مثال كيفية إستخدام هذه المكتبة بدلا من المكتبة العادية : https://pub.dev/packages/multi_image_picker/example و يمكنك فهم الكود بطريقة بسيطة كالتالي Future<void> loadAssets() async { // هنا نقوم بعمل ليست من الصور و هي اسسيت List<Asset> resultList = <Asset>[]; String error = 'No Error Detected'; try { // نقوم باخذ جميع الصور و خفظ الملومات باوبجكت و من ثم وضعها داخل مصفوفة resultList = await MultiImagePicker.pickImages( maxImages: 300, enableCamera: true, selectedAssets: images, cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"), materialOptions: MaterialOptions( actionBarColor: "#abcdef", actionBarTitle: "Example App", allViewTitle: "All Photos", useDetailsView: false, selectCircleStrokeColor: "#000000", ), ); } on Exception catch (e) { error = e.toString(); } // If the widget was removed from the tree while the asynchronous platform // message was in flight, we want to discard the reply rather than calling // setState to update our non-existent appearance. if (!mounted) return; // هنا نقوم بحفظ المصفوفة بالستيت setState(() { images = resultList; _error = error; }); } Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Plugin example app'), ), body: Column( children: <Widget>[ Center(child: Text('Error: $_error')), ElevatedButton( // هنا تقوم بعمل كبسة واحد تستدعي الدالة التي تقوم بحقظ البيانات child: Text("Pick images"), onPressed: loadAssets, ), Expanded( child: buildGridView(), ) ], ), ), ); } }
  9. هذه المشكلة قد يكون لها علاقة بمدة التوكين ان كنت تستخدم jwt او اي نوع اخر من ال Authentication فمن خلال الbackend يمكنك تحديد مده صلاحية هذه التوكين و إن كان شئ اخر و قد قمت بذلك مسبقا فالرجاء ارسال الكود الخاص بالتسجل لمعرفة المزيد من التفاصيل عن الموضوع
  10. دائما يكون حل هذه الأمور بطريقة بسيطة يمكنك ان تقوم بعمل مصفوفة تحفظ لك الصور المحملة و بعد أن تقوم بتخميل كامل للصورة يمكنك أن تعيد الحالة الى ما كانت عليه سابقا أي فارغة و كلما حملت صورة سيتم حفظها داخل المصفوفة و عند عرضها يمكنك أخذ جميع البيانات منها و عرض كل واحد على حدة انا لست خبيرة بالفلاتر و لكن هذا دائما ما يكون الحل لجميع الأكواد المكرره او حتى يمكنك عمل class صنف يحتوي على تعريف الامور التي ستقوم بتخزينها لكل صورة العنوان و القيمة الحقيقة للصورة و من ثم حفظها بمصفوفة
  11. سيدي العزيز هل يقوم هذا الكود بحفظ البيانات بطريقة صحيحة ؟؟؟ إن كنت قد قمت بتعرف قائمة البيانات بحفظ مصفوفة من البيانات ك answers يمكنك عمل الاتي router.post("/", async (req, res) => { let newQuest = new Quest({ name: req.body.name, // هنا فقط تقوم باخد اسم المتغير من البودي و وضعه كامل كما هو answers: req.body.answers }) newQuest = await newQuest.save(); res.send(newQuest); }); و ان لم تقم بتعريف قائمة البيانات بأخذ الأجوبة كمصفوفة فيمكنك عمل الاتي router.post("/", async (req, res) => { // هنا تفوم بعمل لوب و تحفظ كل قيمة على حده و لكن بنقس اسم السؤال var finalresult =[] for(var i = 0 ; i< req.body.answers.length ; i++){ let newQuest = new Quest({ name: req.body.name, answers: [ { num: req.body.num, ansName: req.body.ansName, correct: req.body.correct, }, ], }); newQuest = await newQuest.save(); finalresult.push(newQuest) } res.send(finalresult); });
  12. للتنسيفات يوجد مكتبات كثيرة منها material-ui , ant-Design, Semanic-UI و تعتبر الماتيريال UI من افضل المكتبات لعمل تنسيق للريئاكت و يمكنك استخدام كلا المكتبتين معا لعمل تنسيق جميل.
  13. يمكنك على الإقل حفط ملف json تخزن فيه جميع المعلومات المطلوبة و تعديلة أو إضافة شي خلال قارئ الملفات fileReader و لكنها عملية بعض الشيئ غير جيده للإستعمال إن كان هنالك أكثر من مستخدم يحاولون فتح هذا الملف و تعديل البيانات فسوف يكون محجوز للمستخدم الآخر لذلك كما قال اللأخ عبد المجيد اللأفضل بهذه الامور عمل سيرفير خلفي يؤمن تواصل لك للبيانات و يمكن تعديلها و حذفها بطرق اسهل و اكثر دقة و مرونة و سيكون موضوع الحماية اعلى على طريقة السيرفر الخلفي اكثر
  14. دالة toFix تستخدم نظام الباينري للحساب و ليس جميع الارقام يقوم تحويلها بطريقة دقيقة بعد الفاصلة العشرية مثلا 2.34.toFixed(1) // يرجع '2.3' 2.35.toFixed(1) // يرجع 2.4 اي يقوم بتقريب الى اعلى قيمة 2.55.toFixed(1) // يرجع 2.5 اي يقوم بتقريبها الى القيمة الاقل
  15. يوجد بعض الاختلافات بين ال fetch و الاكسيوس ساوضح بعضها كالتاللي : fetch لا يوجد تحويل مباشر الي صيغة json بما معناه النتيجة الراجعه لن تكوم على شكل json و عليك اولا استقبال القيمة و من ثم تحويلها فيما يخص axios فانه يستقبل القيمة و يحولها فورا اكسيوس يدعم تحديثات البراوزر اكثر من الفيتش حيث ان fetch تدعم فقط Chrome 42+, Firefox 39+, Edge 14+, and Safari 10.1 fetch تستخدم قيمة الbody اكسيوس يستخدم قيمة data ,و كما قلنا بالاعلى اكسيوس يحتوي على قيمة اوبجت اما الفيتش فسوف تحتاج الى استخدام json.stringified او json.pars لتحويل المعلومات الي الصيغة المرادة يسمح Axios بإلغاء الطلب وانتهاء مهلة الطلب اما الفيتش فلا يسمح بذلك fetch بلد ان لذلك لست بحاجة الى تنصيبها للاستخدامها اما ال axios فإنك بحاجة الى تنصيب الملف ليس من الخطأ استخدام fetch و لكن من الافضل استخدام مكتبة لها دعم اكبر في المتصفحات كما انها اكثر سهولة و مرونة
  16. يمكنك أن تمر على جميع الحقول داخل الدكشنري و فحص قيمة كل حقل على حدى لمعرفة ان كانت القيمة موجودة كالتالي simpleDic={"a":100, "b":200, "c":300} for key in simpleDic : if simpleDic[key] ==200: return True;
  17. لإضافة عنصر جديد الى هذه المجموعه يمكنك أن تستدعي اسم المجموعه و من ثم بين '[]' ضع اسم العنصر الجديد و من ثم تساويها بقيمة جديده كالتالي : mobiles = { mobile1: {'Company':'iphone', 'model':'XR', 'OS':'IOS', "price":67000} , mobile2: {'Company':'Samsung', 'model':'Note 10', "OS":'Android', 'price':87000} } mobiles['mobile3'] ={'Company':'iphone2', 'model':'XR2', 'OS':'IOS2', "price":670002} للتغيير أي قيمة داخل موسوعة عليك إستدعاء أسم الموسوعة و من ثم إستخدام رمز القيمة التي تريد الوصول إليها مثلا إسم المسوعة mobile و أنا أريد ان أصل الى العنصر mobile1 لذلك سأكتب mobiles['mobile1'] هنا قد وصلت الى الموسوعة الداخلية التي تتضمن عدة حقول و كما استخدمنا حقل mobile1 للوصول الى هذه الموسوعة الداخلية علينا أن نستخدم أسم الحقل الداخلي حتى نستطيع الوصول الى قيمته أو تغيير قيمته كالتالي : mobiles['mobile1']['model '] هنا وصلنا الى القيمة للموديل في الموبايل الاول #و من هنا يمكننا يغيير القيمة باسناد اي قيمة جديدة ترغبها للسطر الاعلى كالآتي # mobiles['mobile1']['model']="Any New Value" #اما هنا فالتغيير يكون على المبايل الثاني 2 mobiles['mobile2']['model']="Any New Value" أما بالنسبة لحذف اي حقل او عنصر داخل هذه الموسوعة عليك استخدام نفس التسلسل المستخدم بالاعلى حتى تصل للحقل مسبوقا بكلمة del للحذف كالتالي : del mobiles['mobile2']['price']
  18. هذه المشكلة عموما من تحديث الكروم الجديد , حسب ما أعتقد عليك أن تحدد بعض القيم لملف الصوت حتى يتم سماع الصوت, هنا صديقي بعض الكود الذي يجب أن تستخدمه حتى يتم سماع الصوت من غير مشاكل كالتالي :
  19. هل يمكنك ارسال السكيما schema لقاعدة البينات حتى اتعرف اكثر كيف قمت بربط المحادثة مع الاشخاص ؟
  20. نعم يمكنك ان تستخدم except لاستثنائين بهذه الطريقة : except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except (KeyboardInterrupt, EOFError) as err: print(err) print(err.args) sys.exit(0) جميع هذه الاكواد تصلح ان تعمل لعدة استثناءات
  21. ال setTimeout عبارة عن امر نمرر اليه امر اخر فعندما تقوم بتمرير this.setState فان this. سوف تشير الى النافذة لان الامر تابع للنافذه و this سوف تشير الى الجزء او الobject الذي ينتمي اليه الامر لذلك يمكنك ببساطة خلق متغير اخر يحمل المؤشر الي ال component المراد العمل عليه و من ثم استخدامه مره اخرى ادخل ال setTimeout كالتالي Class Counter extends React.Component({ getInitialState() { return {count: 0}; } componentDidMount() { var that = this; # نضيف هنا مؤشر الcomponent المراد اضافة الامر عليه setTimeout(that.setState({count: 1}), 3000); } render() { return ( <div className="count-wrapper"> {this.state.count} </div> ); } }); ReactDOM.render(<Counter />, document.getElementById('app'));
  22. def fun(): x=x*3 return(y) x=1 fun() تعريف الدالة او الامر صحيح لكن انت هنا تقوم بضرب قيمة غير معرفة بقيمة 3 في هذا السطر x=x*3 فهنا x فقط مؤشر في الذاكره لا يحتوي اي قيمة و لا يمكننا استعمال المؤشرات التي لا تدل على قيمة بداخلها اثناء العمليات الحسابيه للقيلم بعمليات حسابيه يجب ان يكون هنا قيمة للمؤشر x حتى يتم عمل الحسابات المرادة ثم بعد ذلك انت تقوم بارجاع ايضا y و التي لم تقم اصلا بتعريفها باي مكان و لا اسناد اي قيمة لها فكما قال لك السيد وائل يجب انت تقوم باسناد قيمة او حتى تعريفها مؤقتا حتى يتم كتابتها بالذاكرة و من ثم استخدامها داخل برنامجك كالتالي : def fun(): y=x*3 return(y) fun() OR //--------------------------// def fun(x): return x*x fun(3) OR //---------------------------// def fun(): x=1 y= x*x return x fun()
  23. للحصول على المعلومات من ال axios عليك استحدام دلالة ال then و ال catch هذان مفهومان تابعان لل asyn بحيت ان الارسال request الي السيرفير سوق ياخد وقت و لن يعود بالمعلومات بنفس الدقيقة ممكن ان يتاخر حسب سرعه الانترنت مثلا و السيرقير و عوامل اخرى كثيرة لذلك ان كان السطر التالي يعتمد على الطلب الذي قمتي به بالaxios request عليك استحدام await قبلها و من هنا سينتظر البرنامج الى ان ينقذ السطر و يعود بالبيانات من السيرفير و ايضا علينا تحديد ان كان هذا الطلب من فئة post , get, pus .. الخ لذلك سيكون طريقة كتابة سطر تنفيذ الaxios كالتالي : await axios.post('/api',{ anyparametername:valueofparamete}) هذا في حالة ان كنت تريد ان ترسل معلومات الى السيرقر اما في حالة طلب معلومات من السيرفر فسوق يكون كالتالي : await axios.get("api") الان هنا قما بتنفيذ الaxios و لكننا لم ناخذ المعلومات الراجعه منه بعد و كما قلنا فان الaxios لن يقوم بارجاع النتيجة مباشرة لذلك سيقوم بحفظ المعلومات ك promis و هي حاضنة للاحداث حيث انها سترجع pendding ان لم يقوم السيرفر بارجاع البينات بعد اما ان قام بارجاها سيقوم بحفظ النتيجة بداخلها لذلك علينا استحراج هذا البيانات من ذاحلها بهذا الطريقة await axois.get("api").then(result=>{ console.log(result) }) }) هنا في حالة ان كل شئ تم بطريقة صحيحة و تم استعاده معلومات اما في حالة انه حصل خطأ بالسيرفير او نقس العمليه علينا استحدام ال catch لنتبين ما هو الخطأ الذي حصل اثناء التنفيذ كالتالي await axois.get("api").then(result=>{ console.log(result); }) .catch(error=>{ console.log(error) }) ارسلت لك يعض الصور التوضيحية لذلك
×
×
  • أضف...