Nuhla Almasri
-
المساهمات
122 -
تاريخ الانضمام
-
تاريخ آخر زيارة
إجابات الأسئلة
-
إجابة Nuhla Almasri سؤال في ماذا يكون type hints في بايثون؟ كانت الإجابة المقبولة
type hints هي طريقة لأعطاء البايثون دلالة للقيمة الراجعة أو حتى الأصناق على القيمة المحتملة التيى تقوم ببناءها و هي طرdقة جيدة لمساعدة ال type checkers للبايثون بحيث أنه بهذه الطريقة يقوم بمعرفة ماذا يجب أن تمرر أو أن ترجع و من هنا يستطيع ال type checkers بسهولة أن يخمن إن كنت تقوم بإرسال صنف غير متوقع و مثال على هذا الموضوع التالي :
def headline(text, align=True): if align: return f"{text.title()}\n{'-' * len(text)}" else: return f" {text.title()} ".center(50, "o") print(headline("python type checking")) print(headline("python type checking", align=False)) #--------------- أضف الآن تلميحات الكتابة عن طريق التعليق على الوسيطات وقيمة الإرجاع على النحو التالي: def headline(text: str, align: bool = True) -> str:# هنا نقوم بتحديد الصنف للقيمة الراجعة لتسهيل عملية التحمين if align: return f"{text.title()}\n{'-' * len(text)}" else: return f" {text.title()} ".center(50, "o") print(headline("python type checking", align="left")) print(headline("python type checking", align="center"))
-
إجابة Nuhla Almasri سؤال في ما هي فائدة الشرطتين السفليتين "__" في خصائص الأصناف في بايثون؟ كانت الإجابة المقبولة
يقوم Double Pre Underscores بإخبار مترجم Python بإعادة كتابة اسم السمة للفئات الفرعية لتجنب تعارض التسمية. Name Mangling: - يقوم مترجم Python بتغيير اسم المتغير بطريقة تجعل من الصعب الصدام عندما يتم توريث الفئة.
بما معناه أن البايثون يقوم بتغيير الأسم حتى لا يكون هناك اي تصادمات بين اسماء المتغيرات الموجود فحتى لو حاولت أستخدام اوبجت من الصنف ثم قمت بإستخدام أسم هذا المتغير حتى تقوم بتغييره أو طباعته فلن يكون موجود على الإطلاق لانه تم تغيير أسم المتغير بهذه الطريقة
class Sample(): def __init__(self): self.a = 1 self._b = 2 self.__c = 3 obj1 = Sample() dir(obj1) فلن يقوم بطباعة الخاصية __c
أما أن أردت طباعتها قستقوم بالتتالي
print(obj1._Sample__c) تعمل هذه الحاصية حتى يتم التفريق بين المتغيرات و خصوصا بالتوريت فأذا اردت أستخدام نفس أسم المتغير في الأصناف التي يتم توريثها من صنف آخر فما عليك سوي وضع هاتين الشرطتين و هنا سأقوم بوضع مثال على التوريث كالتالي
class Sample(): def __init__(self): self.a = 1 self._b = 2 self.__c = 3 #هنا صنف ثاني يرث من الصنف الأول class SecondClass(Sample): def __init__(self): super().__init__() self.a = "overridden" self._b = "overridden" self.__c = "overridden" obj2 = SecondClass() print(obj2.a) #سيقوم بطباعة override print(obj2._b) #سيقوم بطباعة override print(obj2.__c)# سيقوم بإعطاء أنه لا يوجد متغير بهذا الأسم # لكن هنا يمكنك أن تستخدم المنغير للصنف الأول و الثاني أيضا بهذا الطريقة print(obj2._SecondClass__c) #سيطبع overridden print(obj2._Sample__c) # سيطبع 3
-
إجابة Nuhla Almasri سؤال في كيفية تنفيذ أمر shell باستخدام بايثون؟ كانت الإجابة المقبولة
يمكنك أستخدام subprocess الذي يتيح لك فتح تيرمنل و تمرير الأوامر اليها هناك طريقة قديمة و لكن تعتبر هذه المكتبة أفضل للأستخدام
و هنا مثال يوضح كيفية الأستخدام
#هنا نقوم بإدرجاج المكتبة import subprocess #هنا نقوم بـأجراء الأمر و ناحذ القيمة الراجعه list_files = subprocess.run(["ls", "-l"]) #نطبع القيمة الراجعه من تنفيذ الأمر print("The exit code was: %d" % list_files.returncode)
-
إجابة Nuhla Almasri سؤال في هل ال useEffect عندما أقوم بوضع داتا متغيرة داخل الاراى الخاصة به .. هل هذه الداتا المتغيرة اللتى تؤدى الى كثرة استدعاء ال useEffect هل هذا يؤثر على جودة التطبيق ؟؟ كانت الإجابة المقبولة
أنت تقوم بطباعة البيانات خارج ال useEffect أي أنه سيتم الطباعة بأي تحديث لاي شيئ , لكن إن كانت الطباعة داخل ال useEffect فلن يتم الطباعة إلا بحالة تغيرت قيمة الحالة booksData
تسلسل الأحداث تكون كالتالي :
onMount => يتم تغيير الحالة booksData الى الحالة الفارغة أو بلا قيمة الراجعه من الستيت للريدكس initial state هنا ستتغير قيمة الحالة فيتم عمل Render و هنا يقوم بالطباعة ثم يقوم بدخول الuseEffect بما أنه يعمل على تتبع هذه الحالة و يقوم بأستدعاء الدالة لل ال dispatch تقوم هذه الدالة بتغيير قيمة الحالة الى القيمة الجديدة fبالريدكس و تغيير ال props أيضا و هنا أيضا يقوم بالطباعة ثم يدخل ال useEffect مرة أخرى فيقوم بمنادلة الدالة مرة أخرى و يقووم بتغيير الحالة الى المعلومات الجديدة و هنا يقوم بالطباعة و لكن في حال أن كانت الحالتين متطابقتين فلن يقوم بدخول الuseEffect مرة أخرى أما بحالة أختلفت الحالتين بأي قيمة فسيقوم بدخول الuseEffect مرة أخرى لاحظ أنه هنا يقوم بالطباعة سواء أختلفت قيمة الحالة أو لا فإنه يقوم بالطباعة لانها ليست داخل ال useEffect و ذلك لأن إعطاء قيمة جديدة للحالة يقوم بعمل Render أي يرسمه مرة أخرى و الحالة هنا نقصد ب ال props لأن إستدعاء الريدكس يغير ال props مباشرة مما يؤدي الى عملية الRender و ليس الstate يمكنك القيام بالتالي حتى لا يتم أستدعاء دالة الdispatch بطريقة عشوائية
export default function MainScreen() { const booksData = useSelector(state => state.booksData); const dispatch = useDispatch(); //- هنا نطلب أيتم تطبيق الدالة لل dispatch // فقط خلال onMount // بهذه الطريقة سيتم ‘ستدعاء الدالة مرة واحدة فقط عند تحميل المكون أول مرة // و عند الضغط على الزر فقط useEffect(() => { dispatch(getBooks()); console.log(booksData); }, []); return ( <View> <Text>MainScreen</Text> {booksData?.length !== 0 ? <Text>{booksData[3]?.name}</Text> : null} <Button title="test" onPress={() => dispatch(getBooks())} /> </View> ); }
-
إجابة Nuhla Almasri سؤال في قمت بحل مشكلة ال formData بالنسبة للصورة ولكن الان هناك مشكلة اخرى وهى ان الاسم لا يتم عمل post له كانت الإجابة المقبولة
يبدو أن الأسم لا يصل الى السيرفر ليتم حفظها بعد ذلك في قاعدة البيانات هل تستطيع ان تقوم بأرسال الراوت المسؤول عن استلام هذه المعلومات و قبل ذلك هل يمكنك طباعة البيانات الواصلة الهذا الراوت و معرفة ما يحتويه و إرفاق صورة لقيمة الكونسول .
مثلا عليك كتابة console.log(res.body)
-
إجابة Nuhla Almasri سؤال في كيف أرفع صورة على السيرفر باستخدام Axios. كانت الإجابة المقبولة
حسنا هنا دالة تقوم بخلق الformdata بشكل صحيح و إرجاع المعلومات الى طلب الaxios
// دالة لخلق الformdata // نرسل لها قيمة الصورة - و قيمة باقي المعلومات في المحتوي body const createFormData = (photo, body = {}) => { // هنا نخلق ال Formdata const data = new FormData(); // نقوم بوضع المعلومات الخاصة بالصورة فيها data.append('photo', { name: photo.fileName, type: photo.type, uri: Platform.OS === 'ios' ? photo.uri.replace('file://', '') : photo.uri, }); // هنا نقوم بوضع جميع المحتويات داخل المحتوي Body Object.keys(body).forEach((key) => { data.append(key, body[key]); }); // و نعيد البيانات من هنا return data; }; و هنا نقوم بأرسال جميع القيم بال axios
const postData = () => { fetch(`${SERVER_URL}/api/upload`, { method: 'POST', // هنا نستخدم الدالة و نقوم بإعطائها المعلومات المرادة body: createFormData(photo, { userId: '123' }), }) .then((response) => response.json()) .then((response) => { console.log('response', response); }) .catch((error) => { console.log('error', error); }); }; بالطبع يمكنك إستبدال الfetch ب ال axios
-
إجابة Nuhla Almasri سؤال في هل من الممكن إنهاء thread قيد التشغيل في بايثون؟ كانت الإجابة المقبولة
نعم يوجد طريقة و هي كالتالي :
import sys import trace import threading #هنا نعرف صنف من نوع Thread class KThread(threading.Thread): """هنا يرث الصنف Thread""" def __init__(self, *args, **keywords): threading.Thread.__init__(self, *args, **keywords) self.killed = False def start(self): """ دالة لتعريق بدأ thread """ self.__run_backup = self.run self.run = self.__run # Force the Thread to install our trace. threading.Thread.start(self) def __run(self): """دالة لتشغيل التعقب لهذا ال thread.""" sys.settrace(self.globaltrace) self.__run_backup() self.run = self.__run_backup def globaltrace(self, frame, why, arg): if why == 'call': return self.localtrace else: return None def localtrace(self, frame, why, arg): if self.killed: if why == 'line': raise SystemExit() return self.localtrace # هنا الدالة التي تقوم بقتله def kill(self): self.killed = True ------------------------------------------------------------------------ #طريقة الإستعمال ------------------------------------------------------------------------ #إن كما في ملف آحر علينا إستيراد الملف الذي قمنا بخلقه from KThread import * #نعرف دالة جديدة وخذخ الدالة ستقوم بعمل دوران بشكل طبيعي def func(): print 'Function started' for i in xrange(1000000): pass print 'Function finished' #هنا نعرف متغير من الصنف الذي خلقناه للتحكم بال thread # نعطيقه الدالة ليقوم بتعقب الthread #الخاص بها A = KThread(target=func) # نقوم بتشغيل الدالة عن طريق Start A.start() #هنا فقط لتاخير نهاية البرنامج for i in xrange(1000000): pass #ثم هنا نقوم بقتله A.kill() print 'End of main program' Output: Function started
-
إجابة Nuhla Almasri سؤال في Unhandled Exception: Invalid argument(s) (value): Must not be null كانت الإجابة المقبولة
تمام الموضوع ما زال متعلق بال NULL ارجو القيام بفحص قيمة lang قبل ارسالها الى الدالة sharedPreferences.setInt فتمرير قيمة NULL الى اي دالة قد يؤدي الى نفس المشكلة في حال لم تقم بتعريف قيمة مبدأية لها init value هنا:
Future<bool> commit() async { _sharedPreferences ??= await SharedPreferences.getInstance(); // عليك فحص اي قيمة يتم ارسالها الى أي دالة بالنسخة الجديدة حتى يتم اعتبار ان البرنامج لن يحتوي اي قيمة // null await _sharedPreferences.setInt(LANG, lang); }
-
إجابة Nuhla Almasri سؤال في كيف اشغل ملف صوتى من على الانترنت باستخدام expo .. وما الخطأ فى هذا الكود ؟ كانت الإجابة المقبولة
في التوثيق مكتوب أنه عليك إرسال أوبجت يحتوي على uri و قيمته كالتالي هل بإمكانك ان تستبدل السطر التالي :
const { sound } = await Audio.Sound.createAsync( URL( "https://katateeb-test.roqay.solutions/public/uploads/chats/1/1610544623katateeb_record.mp4" ) // require("https://katateeb-test.roqay.solutions/public/uploads/chats/1/1610544623katateeb_record.mp4") ); بهذه الطريقة
const { sound } = await Audio.Sound.createAsync( { uri: 'https://katateeb-test.roqay.solutions/public/uploads/chats/1/1610544623katateeb_record.mp4' }, { shouldPlay: true } ); و أن واجهتك نفس المشكلة الرجاء إخباري
-
إجابة Nuhla Almasri سؤال في أريد api يكون عليه مخزن عليه ملفات صوتية حتى اتعلم كيف اعمل له get كانت الإجابة المقبولة
إن التعامل مع الريئاكت نيتف (React-Native) تقريبا مطابق للتعامل مع ال React للويب و عند إستخدام أي API يتم التعامل معها بشكل طبيعي عن طريق http Request او ال axios و غيرها لذلك لا تختلف طريقة جلب البيانات من ويب أو موبايل إلا بحالات معينة كجوجل و فيربيز و لكن بكل الأحوال يوجد مكتبات كثيرة تقدم بعض المؤثرات الصوتية بالمجان عن طريق الأ بي أي (API) و بعضها غير مجاني هنا سأذكر بعضها و يمكنك ان تستخدم ما تشاء حسب رغبتك منها كالتالي :
Pizzicato.js
SoundJS
Tone.js
Tuna
XSound
-
إجابة Nuhla Almasri سؤال في ماهى افضل مكتبة للتعامل مع الصوتيات فى react native ؟ كانت الإجابة المقبولة
إستعمال أي مكتبة يعتمد على نوعية البرنامج المراد و أيضا اللغة المرادة هنا يظهر أن هذه المكتبة تستخدم التايب سكربت TypeScript كما أنه فعليا كمية التحميل على npm يظهر لك مدى فعالية المكتبة بحيث ان اي مكتبة عليها قدرة تحميل كبيرة تكون أكثر المكتبات شيوعا و أستخداما و أيضا أكثرها متابعة أخطاء من قبل مطوريها و كما قلنا سابقا فأن إستعمال أي مكتبة يعتمد على كيفية أستخدامها بالبرنامج المراد
لذلك يمكنك أن تذهب الى صفحة ال github الخاصة بهذه المكتبة و ترى نسبة الأخطاء و نسبة التعامل مع هذه الأخطاء من هناك لتضمن أنك لن تقع في أخطاء تصدرها هذه المكتبة و أيضا إستعمالها بشكل فعال أكثر من خلال التعليمات
-
إجابة Nuhla Almasri سؤال في كيف أدمج أو أختصر هذا الكود flutter كانت الإجابة المقبولة
دائما يكون حل هذه الأمور بطريقة بسيطة يمكنك ان تقوم بعمل مصفوفة تحفظ لك الصور المحملة و بعد أن تقوم بتخميل كامل للصورة يمكنك أن تعيد الحالة الى ما كانت عليه سابقا أي فارغة و كلما حملت صورة سيتم حفظها داخل المصفوفة و عند عرضها يمكنك أخذ جميع البيانات منها و عرض كل واحد على حدة انا لست خبيرة بالفلاتر و لكن هذا دائما ما يكون الحل لجميع الأكواد المكرره او حتى يمكنك عمل class صنف يحتوي على تعريف الامور التي ستقوم بتخزينها لكل صورة العنوان و القيمة الحقيقة للصورة و من ثم حفظها بمصفوفة
-
إجابة Nuhla Almasri سؤال في كيف اقوم بعمل post ل array بواسطة postman .. أنا أريد أن ارفع array تحتوى على اكثر من أوبجكت كانت الإجابة المقبولة
سيدي العزيز هل يقوم هذا الكود بحفظ البيانات بطريقة صحيحة ؟؟؟
إن كنت قد قمت بتعرف قائمة البيانات بحفظ مصفوفة من البيانات ك 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); });
-
إجابة Nuhla Almasri سؤال في عمليات التعديل والحذف والإضافة على القاموس - بايثون كانت الإجابة المقبولة
لإضافة عنصر جديد الى هذه المجموعه يمكنك أن تستدعي اسم المجموعه و من ثم بين '[]' ضع اسم العنصر الجديد و من ثم تساويها بقيمة جديده كالتالي :
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']
-
إجابة Nuhla Almasri سؤال في كيف يمكنني ان استخدم try except method لكي استثني خطأين سوية كانت الإجابة المقبولة
نعم يمكنك ان تستخدم except لاستثنائين بهذه الطريقة :
except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except (KeyboardInterrupt, EOFError) as err: print(err) print(err.args) sys.exit(0) جميع هذه الاكواد تصلح ان تعمل لعدة استثناءات