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

El Sayed El Tohamy

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

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

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

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

    1

كل منشورات العضو El Sayed El Tohamy

  1. المطلوب إنشاء من 2 إلى 6 صفحات: ويجب أن يحتوي المشروع على النقاط التالية أ- صفحة تحتوي نمود form بها عدد من خانات الإدخال entry ويتم حفظها (أي إضافة سجل) في جدولٍ ما بقواعد البيانات خاصتك: - قد يكون إضافة منتج في جدول PRODUCT - أو إضافة رحلة في جدول FLIGHT - أو زائر في جدول VISISTOR (أعتقد أنه يقصد VISITOR) - وهكذا ب- صفحة تمكننا من اختيار خيار معين ليتم الانتقال لصفحة معينة بناء على هذا الاختيار: - قائمة منسدلة drop-down list تحتوي على روابط على هيئة أسماء أو صور - قائمة menu تحتوي على روابط على هيئة أسماء أو صور - جدول grid يحتوي على روابط على هيئة أسماء أو صور - وهكذا إضافة إلى ذلك مطلوب منك توقع الصفحات الأخرى لعملية التعديل والحذف. من الواضح أن هذه الصفحة هي التي من خلالها سيتم اختيار العمل المطلوب، على سبيل المثال القائمة قد تحتوي على عناصر مثل - الأصناف - الرحلات - الزوار وعند الضغط على أي منها يتم الانتقال إلى الصفحة المقابلة للاختيار، وهذا هو المطلوب التالي. ج- بعدما يختار المستخدم عنصرًا معينًا من القائمة يتم الانتقال إلى الصفحة المناسبة (المكافئة) ويتم عرض البيانات من جدول بقواعد البيانات د- صفحة تعرض بيانات سجل واحد، ويتم عرضه في نموذج form بها خانات ممتلئة بالبيانات العائدة من قواعد البيانات. هـ - صفحة تعرض نتيجة استعلام الذي يعود بعدة سجلات بحيث يكون العرض ديناميكيًا، أي يعرض جميع السجلات في جدول و- صفحة أخرى تعرض نتيجة استعلام الذي يعود بعدة سجلات ولكن يتم تقسيم النتيجة إلى صفحات بحيث يعرض في كل صفحة عددًا ثابتًا من السجلات (على سبيل المثال 5 سجلات بالصفحة) ويمكن إضافة صفحات أخرى. التصور النهائي: صفحة بها نموذج form من خلالها يتم حفظ البيانات لقواعد البيانات، وقد تحتاج لعدد من هذه الصفحات (صفحة لكل جدول) توجد صفحة أخرى تحتوي على قائمة بها عدد من الاختيارات، عندما يختار أحدها ينتقل إلى صفحة أخرى تناسب هذا الاختيار يوجد عدد من الصفحات الأخرى لعرض البيانات الراجعة من الاستعلامات، فهناك صفحة لعرض سجل واحد، وصفحة لعرض سجلات عديدة دفعة واحدة، وصفحة ثالثة لعرض سجلات عديدة ولكن بتقسيمها على صفحات أما عن كيفية تنفيذ المشروع، سأعرض لك المتطلبات الأساسية لتنفيذ مثل هذا المشروع، هذا مشروع ويب يتطلب مهارة في تطوير الواجهة الأمامية، والواجهة الخلفية، وكذلك التعامل مع قواعد البيانات. هيكل قواعد البينات: يحتوي العديد من الجداول المطلوب حفظ وتعديل وحذف البيانات منها عن طريق تطبيق الويب، الواجهة الأمامية تحتاج على الأقل إتقان الأدوات الأساسية لتطبيق الويب HTML, CSS, JavaScript إضافة إلى إحدى المكتبات أو أُطر العمل التي تساعد في إنجاز التصميم. الواجهة الخادمية (الخلفية) تحتاج إتقان إحدى لغات البرمجة مثل php, python, أو بيئة تطوير مثل node js الحقيقة هذا مشروع ضخم، يحتاج إتقان العديد من المهارات.
  2. استبدل كلمة root بـ self بعد التعديل، قمت بتجربتها على الشجرة (ولكن العناصر أضفتها يدويًا ليس من إكسيل)، وتمت عملية النسخ واللصق بنجاح. هذه شيفرات إضافة العناصر يدويًا self.tree.insert("", "end", text="Item 1") self.tree.insert("", "end", text="Item 2") self.tree.insert("", "end", text="Item 3")
  3. ما المقصود بإضافة أداة الإدخال عليهم؟ تقصد تمكين أداة Entry من النسخ واللصق مثل TreeView؟ إذا كان هذا ما تقصده، فستحتاج لتكرار نفس الخطوات للأداة Entry
  4. الموضوع بسيط جدًا، فالوظيفة تعود بقاموس dict بالفعل، فكل ما عليك هو تعريف متغير (كائن) يستقبل القاموس الراجع من هذه الوظيفة، ثم التعامل مع هذا الكائن، عن طريق طلب أي مفتاح key منه. def func(): var1 = 'Hola' var2 = 'Hola2' return dict(var1=var1, var2=var2) # المتغير التالي نوعه قاموس[نص، نص] # dict[str, str] result = func() # يمكنك معرفة أي قيمة عن طريق المفتاح الخاص بها print(result["var1"])
  5. يمكنك إضافة أي أداة مهما كانت المكتبة الخاصة بها، يتم ذلك داخل الباني __init__ بحيث تجعل المعامل الأول للأداة هو self مثل المثال التالي: class app(tk.Tk): def __init__(self) -> None: super().__init__() self.tree = ttk.Treeview(self) self.tree.pack() self.entry2 = tk.Entry(self) self.entry2.pack()
  6. في البداية لن تحتاج للوراثة غير من التصنيف tk.Tk فقط، هذه الشيفرة كاملة بعد وضعها داخل تصنيف class يسمى app import tkinter as tk from tkinter import ttk class app(tk.Tk): def __init__(self) -> None: super().__init__() // لاحظ أن الكائن التالي يحتاج مكتبة // ttk self.tree = ttk.Treeview(self) self.tree.pack() self.tree.insert("", "end", text="Item 1") self.tree.insert("", "end", text="Item 2") self.tree.insert("", "end", text="Item 3") self.popup = tk.Menu(self.tree, tearoff=0) self.popup.add_command(label="Copy", command=lambda: self.copy_item()) self.popup.add_command(label="Paste", command=lambda: self.paste_item()) self.tree.bind("<Button-3>", self.show_popup) def copy_item(self): item = self.tree.selection()[0] self.clipboard_clear() self.clipboard_append(self.tree.item(item, option="text")) def paste_item(self): text = self.clipboard_get() self.tree.insert("", "end", text=text) def show_popup(self, event): row = self.tree.identify_row(event.y) if row: self.tree.selection_set(row) self.popup.post(event.x_root, event.y_root) form = app() form.mainloop()
  7. الخطأ ينبهك أنك تحاول استخدام next/router في جهة الخادم server-side. السبب أن جهة الخادم server-side عبارة عن بيئة تطوير تستخدم إطار عمل Next.js وهذا الإطار لا يدعم Router لأنه يخص المتصفح، حاول تجربة الشيفرات التالية: import React, { useEffect } from "react"; import { useRouter } from "next/router"; const [Theme, setTheme] = useState("light"); function themeSwitcher() { const router = useRouter(); useEffect(() => { if (Theme === "light") { setTheme("dark"); console.log(Theme); router.push({ pathname: "/layout", query: Theme, }); } else { setTheme("light"); console.log(Theme); router.push({ pathname: "/layout", query: Theme, }); } //لاحظ أن الخطاف سيعتمد على قيمة الكائن // Theme }, [Theme]); } return ( <div> <button onClick={themeSwitcher}>light/dark</button> </div> );
  8. أنت أنشات تصنيفًا class وتريد وضع الشيفرات بداخله؟ هل التصنيف يرث من أي تصنيف آخر؟ يرجى مشاركة الأجزاء الأولى من الشيفرات الخاصة بك، بحيث يظهر إنشاء التصنيف والباني __init__
  9. بالتأكيد عند فشل الواجهة البرمجية ستكون قيمة الكائن nriRates = undefined، لذلك حاول تغيير السطر التالي: //setNriRates(res?.data?.data); setNriRates(res?.data?.data || []); هذا سيعود بمصفوفة فارغة في حالة لم يجد res أو data ملحوظة أخرى ليس لها علاقة بالمشكلة الحالية ولكنها تهم كل من يستخدم الوجهات البرمجية api: في أغلب الأحيان تعود الواجهة البرمجية باستجابة ولكن قد تكون الاستجابة قيمتها غير 200، مثل غير موجود (400)، لذلك قد يقع الكثير من المبرمجين في هذا الخطأ ويعتقد أن الواجهة عندما تفشل فإنه res سيكون غير معرف، ولكن أحيانًا تعود باستجابة 400 أو 500 نتيجة عدم تواجدها أو انشغال الخادم ومثل هذه المشاكل، ولكنه قد عاد باستجابة فعليًا. لذلك، نصيحتي لكل المبرمجين، عندما تريد معرفة نجاح أو فشل الواجهة البرمجية api لا تسأل عن res له قيمة أم ليس له قيمة، ولكن يجب عليك السؤال عن قيمته، فإذا كانت 200 يعني نجاح الأمر، أما القيم الأخرى تدخل على فشل الأمر.
  10. يمكن استخدام الشيفرة التالية، ولكن هناك ملاحظة: بخصوص عنوان الموضوع، يفضل أن يكون العنوان معبرًا عن المحتوى حتى يمكنك الرجوع إليه فيما بعد، وحتى تعم الفائدة للجميع. # وضع قيم مبدئية للمتغيرات uppercase = False symbol = False length = False # تعريف الرموز التي يجب أن يحتوي واحدًا منها، بالتأكيد يمكننا الإضافة إليها symbols = "!@#$%&*" # نختبر طول كلمة المرور if len(password) >= 8: length = True # حلقة تكرارية على كل حرف for char in password: # نختبر إذا كان الحرف كبيرًا if char.isupper(): uppercase = True # نقوم بتغيير قيمة المتغير لأن هذا الشرط تم استيفاؤه # نختبر إذا الحرف رمز if char in symbols: symbol = True # تم استيفاء الشرط if not uppercase: print("Should include at least one lowercase character") if not symbol: print("Should include at least one of these symboles !@#$%&* ") if not length: print("Length should be at least 8 characters") يتبقي اختبار الأحرف الصغيرة والأرقام، أتركها لك للتدريب. إرشاد: ستتم بنفس الطريق، ولكن يجب إيجاد الوظيفة المناسبة من وظائف str
  11. سأرسل لك الشيفرة كاملة import tkinter as tk from tkinter import ttk root = tk.Tk() tree = ttk.Treeview(root) tree.pack() tree.insert("", "end", text="Item 1") tree.insert("", "end", text="Item 2") tree.insert("", "end", text="Item 3") popup = tk.Menu(tree, tearoff=0) popup.add_command(label="Copy", command=lambda: copy_item()) popup.add_command(label="Paste", command=lambda: paste_item()) def copy_item(): item = tree.selection()[0] # تنظيف الذاكرة root.clipboard_clear() # نسخ عنوان العنصر إلى الذكرة root.clipboard_append(tree.item(item, option="text")) # تعريف وظيفة لعملية اللصق def paste_item(): text = root.clipboard_get() tree.insert("", "end", text=text) # تعريف وظيفة لإظهار القائمة def show_popup(event): # تحديد الصف تحت مؤشر الفأرة row = tree.identify_row(event.y) # في حالة أن الصف ليس فارغًا if row: # نقوم باختيار الصف من الشجرة tree.selection_set(row) # إظهار القائمة popup.post(event.x_root, event.y_root) tree.bind("<Button-3>", show_popup) root.mainloop() يمكنك استخدام الشيفرة كما هي أو وضعها داخل تصنيف class
  12. ربما تحتاج استبدال هذه الأسطر self.popup_menu.add_command(label="Cut", command=lambda: self.entry1.event_generate("<<Cut>>")) self.popup_menu.add_command(label="Copy", command=lambda : self.entry1.event_generate("<<Copy>>")) self.popup_menu.add_command(label="Paste", command=lambda: self.entry1.event_generate("<<Paste>>")) بهذه self.popup_menu.add_command(label="Cut", command=lambda: self.cut_item()) self.popup_menu.add_command(label="Copy", command=lambda: self.copy_item()) self.popup_menu.add_command(label="Paste", command=lambda: self.paste_item()) def cut_item(): item = tree.selection()[0] root.clipboard_clear() root.clipboard_append(tree.item(item, option="text")) tree.delete(item) def copy_item(): item = tree.selection()[0] root.clipboard_clear() root.clipboard_append(tree.item(item, option="text")) def paste_item(): text = root.clipboard_get() tree.insert("", "end", text=text) بالتأكيد يمكننا تحسين الكود عن طريق دمج الوظيفتين copy_item و cut_item ووضع معامل لتحديد المطلوب هل هو قص أو نسخ، ولكن فضلت كتابتها بهذا الشكل لتكون الصورة واضحة. مع استخدام def show_popup_menu(self,event): self.popup_menu.post(event.x_root, event.y_root)
  13. السطر الأخير يقوم بحذف الكائن draw الذي تم تعريفه مسبقًا، وذلك لتحسين الأداء وتفريغ الذاكرة، بعدما قام بمهمته، وهو يستخدم لرسم أشكال بسيطة وكتابة نص بسيط على الصور.
  14. كما توقعنا، الجزء التالي مفترض يكون المقارنة بين الوجه المعروف والأوجه الغير معروفة. الآن لدينا تشفير لصورة Malan، ولدينا قائمة بأماكن وتشفيرات الصورة الموجودة بصورة Harvard الحلقة التكرارية تقوم بالدوران على كل صورة بالقائمة Harvard وتقوم بمقارنتها مع صورة Malan عن طريق الوظيفة compare_faces التي تعود بقيمة True or false في الحقيقة يجب أن نوضح الوظيفة compare_faces بشكل أعمق حتى نفهمها ونستطيع استخدامها بشكل صحيح، هذه الوظيفة تحتاج معاملين: الأول عبارة عن قائمة list تحتوي على تشفيرات الأوجه المعروفة (في حالتنا هذه تحتوي على عنصر واحد فقط وهو تشفير وجه Malan) الثاني عبارة عن تشفير للوجه المراد اختباره مقابل القائمة المعروفة وتعود هذه الوظيفة بقائمة من القيم المنطقية True/False التي تعبر عن تطابق أو عدم تطابق الوجه المختبر مع كل وجه من القائمة المعروفة، في حالتنا ستحتوي هذه القائمة على عنصر واحد فقط، ولكن إذا افترضنا أن لدينا ثلاثة أوجه معروفة، ففي هذه الحالة ستعود الوظيفة بقائمة تحتوي على ثلاثة عناصر. أما الوظيفة face_distance فهي تعمل بشكل مشابه للوظيفة face_compare ولكنها تعود بقائمة تحتوي على قيم عددية بين 0 و 1، هذه القيم تعبر عن البعد بين الصور المعروفة والصورة المختبرة، كلما قلّت القيمة كلما كان أكثر تشابهًا، لذلك القيمة 0 تعني لا توجد مسافة (أي تطابق تام). في حالتنا بالتأكيد ستعود بقيمة واحدة لأن لدينا صورة واحدة معروفة، أما لو كان هناك أكثر من صورة فستعود بقائمة بها عدد عناصر يساوي عدد الصور ويعبر عن مدى بعد الصورة المختبرة عن كل صورة معروفة. السطر الثالث يعود برقم العنصر الأقل مسافة (أي الأكثر تشابهًا)
  15. هي سهلة جدًا، يمكن أن أقولها لك، ولكن أريدك البحث عنها بنفسك، لتنمية مهارة التعليم الذاتي، وإليك إرشاد: سيتم تغيير الوظيفة contains بوظيفة أخرى. بالتوفيق والسداد،
  16. السطر المستخدم في تشفير صورة Malan يقوم بتشفير وجهًا واحدًا فقط، الذي هو صورة Malan ولكنه يقوم بالبحث عن جميع أماكن الأوجه بالصورة الثانية ويقوم بتشفيرها جميعًا هذا السيناريو يستخدم عندما تكون صورة Malan تحتوي على وجهٍ واحد (الذي هو وجه Malan)، لذلك لا نحتاج للبحث عن أماكن الأوجه حيث لا يوجد إلا وجه واحد نعرفه، والمفترض الذي سنستخدمه فيما بعد للتعرف عليه واستخراجه من الصورة الثانية Harvard باختصار، نستخدم صورة Malan لمعرفة تشفير وجهه، ثم نستخدم الصورة الثانية Harvard لاستخراج Malan من بين أصدقائه. # encodings # البحث عن جميع الأماكن التي يوجد بها أوجه harvard_locations = face_recognition.face_locations(harvard) # تشفير كل الأوجه الموجودة في هذه الأماكن harvard_encodings = face_recognition.face_encodings(harvard , harvard_locations) # تشغير وجهًا واحدًا وهو يعبر عن وجه مولان # (الذي في الغالب لن يوجد غيره بهذه الصورة، أو قد يكون هناك عدة أوجه ولكن كلها له) # تم استخدام [0] لأن الوظفية تعود بقائمة من المصفوفات، # list of arrays # فنحن نريد المصفوفة الأولى malan_encodings = face_recognition.face_encodings(malan)[0] لاحظ أن هذه الطريقة قد تسبب مشكلة إذا احتوت الصورة Malan على أوجه لأناس مختلفين، لأنه في هذه الحالة سيقوم بتشفير أول وجه بالصورة، وقد لا يكون وجه Malan.
  17. قبل الإجابة على السؤال، يجب توضيح شيئًا هامًا جدًا، وهو أنه لا يوجد إجابة مطلقة للأسئلة مثل: - ما أفضل لغة برمجة - هل لغة البايثون أفضل من PHP السؤال الصحيح هو: ما الأنسب للحالة الحالية؟ لأن كل حالة لها الأدوات الأنسب لها، ففي بعض الأحيان قد يكون استخدام مكتبة مثل الريأكت عائقًا وليس مُشهلًا، في حالة كان المطلوب مثلًا صفحة بسيطة جدًا، أما بخصوص استخدام المكتبات وأُطر العمل، فبالتأكيد لها فوائد كثيرة جدًا، منها: - تسهيل العمل وتسريع الإنتاجية - الشيفرات المستخدمة موثوقة وتم اختبارها والتأكد من كفاءتها - تقديم إمكانيات غير موجودة بالأدوات الأصلية - تقديم خطوات أو أوامر تثبيت توفر الكثير جدًا من الوقت لذلك يُنصح بإتقان إحدى هذه المكتبات، حيث أنه ليس من المنطقي أن يتم تطوير موقع الويب من البداية وباستخدام الأدوات الأصلية HTML, CSS, JavaScript
  18. وعليكم السلام ورحمة الله وبركاته. في البداية يجب أن نعرف معلومة هامة جدًا، أن لغات التنصيص مثل HTML, CSS, JavaScript هي اللغات الأساسية التي تعتمد عليها جميع المكتبات مثل البوتستراب Bootstrap، وجميع أدوات صناعة المحتوى CMS Content Management System مثل الووردبريس، وأيضًا مكتبات الصفحة الواحدة مثل React, Vue وذلك لأن المتصفح لا يفهم إلا هذه اللغات. إذن فلماذا تم تطوير هذه المكتبات وأُطر العمل وأدوات صناعة المحتوى؟ - أولاً: لتسهيل إنشاء صفحات الويب - ثانيًا: هذه المكتبات تم اختبارها جيدًا وبالتالي فهي تضمن الكثير من الخصائص مثل توافقها مع معظم المتصفحات، ومعالجة المشاكل الأمنية، والتعامل مع الواجهات البرمجية بسهولة api - ثالثًا: أدوات إدارة المحتوى تمكن الغير مبرمجين من إنشاء محتواهم بأنفهسم مثل المواقع الشخصية، أو المدونات، أو موقع تجاري بسيط - رابعًا: إضافة خصائص التجاوب مع جميع أحجام الشاشات مثل البوتسترات Bootstrap - خامسًا: مكتبات مثل ريأكت React وفيو Vue إضافة إلى إطار العمل أنجولار Angular التي تعمل بنظام الصفحة الواحدة SPA أو Single Page Application لا تحتاج الذهاب للخادم لعرض المحتوى، وإنما تقوم بتحميله مرة واحدة ثم تظهر المحتوى المطلوب مما تم تحميله، وبالتالي سرعة ملحوظة جدًا في الأداء باختصار، لغات التنصيص هي الأدوات الأساسية التي يفهمها المتصفح، أما المكتبات وأدوات صناعة المحتوى لتسهيل المهمة سواء للمبرمجين أو لغير المبرمجين.
  19. وعليكم السلام ورحمة الله، المطلوب هو جمع عمودين في DataFrame ولكن مع شرط معين، بمعنى آخر نريد اختبار شرط معين على كل صف والحصول على قيمة بناء على نتيجة هذا الشرط، لذلك نقوم أولًا بإنشاء الوظيفة التي سنطبقها على كل صف، ثم نستخدم الوظيفة apply ونعطيها الوظيفة التي أنشأناها import pandas as pd df = pd.DataFrame({'A': [10, 20, 50, 60, None, 80], 'B': [5, 10, 15, 20, 25, 30]}) # إنشاء وظيفة الاختبار المطلوب تطبيقه على كل صف # يجب ملاحظة أن هذه الوظيفة سيتم استدعاؤها مع كل صف def sum_with_condition(row): # نختبر إذا كانت قيمة الخانة الأولى تحتوي على بيانات وأيضًا قيمتها أكبر من 50 if pd.notnull(row['A']) and row['A'] >= 50: # إذا تحقق الشرط نقوم بجمع الخانة بالعمود الأول مع الخانة بالعمود الثاني return row['A'] + row['B'] else: return 0 # إنشاء عمود جديد وتكون قيمته هو الناتج العائد من الوظيفة # sum_with_condition # التي يتم تطبيقها على كل صف df['C'] = df.apply(sum_with_condition, axis=1) print(df)
  20. الفكرة أن (a-1) * ((a-1) + 1) = (a-1) * (a - 1 + 1) = (a-1) * (a) = (a-1) * a
  21. بارك الله فيك، الحل مضبوط إن شاء الله، ويمكن تحسين المعادلة لتصبح كالتالي # sum = (b * (b + 1) / 2) - ((a - 1) * ((a - 1) + 1) / 2) sum = (b * (b + 1) / 2) - ((a - 1) * a / 2)
  22. بداية شكرًا لك على استخدام القوانين الرياضية التي بكل تأكيد تساهم في تسريع ودقة العمليات الحسابية بشكل خرافي، القانون المقصود - لمن لا يعرفه - قانون رياضي يُستخدم لجمع الأعداد الصحيحة ابتداءًا من 1 حتى قيمة معينة ولتكن n وهو n(n+1)/2 على سبيل المثال لمعرفة مجموع الأعداد من 1 حتى 7 نستخدم القانون 7(7+1)\2 = 7 * 8 \ 2 = 28 ولمعرفة مجموع الأعداد ابتداءًا من قيمة غير 1 وليكن مجموع الأعداد من 5 إلى 7: هنا تتضح مهارة حل المشاكل Problem Solving التي يجب أن يتقنها المبرمج، فيتم بالخطوات التالية: 1- نقوم بحساب مجموع الأعداد من 1 إلى 7 2- نقوم بحساب مجموع الأعداد من 1 إلى ( 5 - 1 ) (أي من 1 إلى 4) 3- نطرح القيمة الصغرى من القيمة الكبرى فتكون المعادلة [ 7 (7+1) \ 2 ] - [ 4 (4 + 1) \ 2 ] = 28 - 10 = 18 إذن مجموع الأعداد 5 + 6 + 7 = 18 الآن التمرين المطلوب من المبرمجين لتقوية مهاراتهم البرمجية: هو كتابة شيفرات برمجية بلغة البايثون لجمع الأعداد من 5 إلى 7 بناء على التحليل السابق. بالتوفيق،
  23. يمكن تنفيذ هذه المهمة بعدة طرق أولها استخدام الحلقات التكرارية، وسنستخدم هذا الأسلوب الذي يناسب ذوي الخبرة البسيطة # تعريف المتغيرات A = 1867 B = 9814 sum = 0 # إنشاء حلقة تكرارية تظل تعمل طالما المتغير الأول أصغر من أو يساوي المتغير الثاني # نلاحظ هنا ان علامة = هامة حتى تم جمع قيمة المتغير # B while A <= B: sum = sum + A A = A + 1 print(sum) ملحوظة هامة: تم كتابة الشيفرات لمساعدتك في بداية المشوار البرمجي، والآن إليك تمرين حاولي حله بنفسك للتدريب على حل المشاكل. المطلوب: التعديل في الشيفرات السابقة بحيث لا يشمل قيمة المتغيرين A, B في عملية الجمع.
  24. وعليكم السلام ورحمة الله وبركاته، إذا كنت تقصد أن الـ Cross-Platform يسحب من حصة لغة سويفت وكوتلن، فبالتأكيد تؤثر عليهم وتسحب من حصتهم ومن طلب التطبيقات عليهم. ولكن دائمًا وأبدًا، لكل أداة أو لغة إيجابيات وسلبيات، ولكل منتج زبائنه فما تراه أنت غير ضروري يحتاجه غيرك. في السنوات الأخيرة بدأت اللغات متعددة المنصات Cross-Platform في الانتشار بسبب ارتفاع تكلفة التطوير لكل نظام، فأصبح العملاء يبحثون عن تطبيق واحد يستطيع العمل على كل المنصات، ومن الناحية التقنية سيكون لديك كود برمجي واحد وهذا في حد ذاته ميزة كبيرة جدًا، إلا أنه في بعض الأحيان تقف اللغات متعددة المنصات عاجزة عن بعض المهام لذلك يتوجب استخدام اللغات المحلية native. أما كيف تواجه الشركات الكبيرة هذا التطور، فلديها عدة استراتيجيات، أول وأهم هذه الاستراتيجيات: هو محاولة جعل لغاتها متعددة المنصات، كما رأينا في الإصدارات الأخيرة لميكروسوفت، وكذلك بالنسبة لجولج التي أنتجت Kotlin Multiplatform والتي من خلاله يمكن إنتاج تطيبقات متعددة المنصات. الاستراتيجية الثانية: محاولة تسهيل التعامل مع لغاتها لجذب المبرمجين الاستراتيجية الثالثة: إمكانيات حصرية تتمتع بها اللغات المحلية مثل الوصول لبيانات شديدة الحساسية في نظام التشغيل وخصوصًا ios بالطبع المنافسة شرسة، لذلك من المهم جدًا على المبرمج أن يتعلم تقنية ولا يتقوقع في لغة معينة بحيث إذا اختفت لا يختفي معها، فالمبرمج يجب أن يتقن حل المشاكل Problem Solving، أفضل الممارسات Best Practices، اتباع المعايير Standards وبالتالي يستطيع التحول من لغة إلى أخرى بسهولة، لأن العالم الآن متقلب جدًا.
  25. وعليكم السلام ورحمة الله، في البداية لابد أن نوضح شيئًا هامًا، وهو أن tuple و list في البايثون ليست مصفوفة بالمعنى المعروف في لغات البرمجة الأخرى، حيث أن المصفوفة تكون عناصرها كلها من نوع واحد one data type أما tuple و list يمكن أن تقبل عناصر من أنواع بيانات مختلفة، لذلك فهي أنواع مركبة تشبه المصفوفة. بخصوص tuple فهو نوع مركب غير قابل للطفرة Immutable بمعني لا يمكنك إضافة عناصر عليه أو حذف عناصر منه أو حتى تغيير قيمة عنصر فيه، لذلك فهو سريع في عملية الاستعلام. بعكس list التي تقبل الإضافة والحذف والتعديل، بالمقابل هي أبطأ في عملية الاستعلام. السؤال الذي يتبادر للذهن: متى استخدم tuple ومتى استخدم list ببساطة شديدة لو عندك بيانات تحتاج عمل استعلامات عليها، مثل المجموع/المتوسط/الأكبر/الأصغر ولكنك لن تضيف أو تعدل فيها فهنا استخدم tuple. أما لو احتجت لإضافة عناصر أو حذفها أو تعديلها فهنا لابد من استخدام list، على سبيل المثال عناصر الفاتورة يجب أن توضع في list حتى تتمكن من إضافة عنصر جديد، أو حذف عنصر وهكذا.
×
×
  • أضف...