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

كل الأنشطة

تحدث تلقائيًا

  1. اليوم
  2. في ملف Form1.cs لديكِ حاولي تحسين دالة continRun_Click للتعامل مع استئناف العمليات بشكل صحيح، مع إضافة رسوم متحركة للزر نفسه، واستخدام Task لضمان استمرارية العمليات غير المتزامنة. private bool isAnimating = false; private CancellationTokenSource animationCTS; private async void continRun_Click(object sender, EventArgs e) { if (isAnimating) return; continRun.Enabled = false; paused.Enabled = true; stopAnimation = false; animationCTS = new CancellationTokenSource(); try { await AnimateButton(continRun, animationCTS.Token); await ResumeAnimation(); } catch (OperationCanceledException) { // التعامل مع الإلغاء إذا لزم الأمر stopAnimation = true; } finally { continRun.Enabled = true; isAnimating = false; } } private async Task AnimateButton(Button button, CancellationToken token) { isAnimating = true; Size originalSize = button.Size; Point originalLocation = button.Location; try { for (int i = 0; i < 5; i++) { if (token.IsCancellationRequested) throw new OperationCanceledException(); button.Size = new Size(originalSize.Width + (i * 2), originalSize.Height + (i * 2)); button.Location = new Point(originalLocation.X - i, originalLocation.Y - i); await Task.Delay(30, token); button.Invalidate(); } for (int i = 5; i >= 0; i--) { if (token.IsCancellationRequested) throw new OperationCanceledException(); button.Size = new Size(originalSize.Width + (i * 2), originalSize.Height + (i * 2)); button.Location = new Point(originalLocation.X - i, originalLocation.Y - i); await Task.Delay(30, token); button.Invalidate(); } } finally { button.Size = originalSize; button.Location = originalLocation; } } private async Task ResumeAnimation() { if (!stopAnimation) { PlayButton(true); await Task.Run(() => { if (!stopAnimation) { switch (currentProcess) { case "Add": AddProcess(); break; case "Sub": SubProcess(); break; case "Mul": MulProcess(); break; case "Div": DivProcess(); break; default: break; } } }); } } وإضافة المتغيرات التالية في بداية الكلاس لتتبع الحالة: private string currentProcess = "Add"; private bool isAnimating = false; private CancellationTokenSource animationCTS; ويجب أن تكون دالة PlayButton(bool) متوافقة مع الاستئناف، تستطيعي استبدالها باستدعاء الدالة الخاصة بالتشغيل. وإضافة using: using System.Threading; using System.Threading.Tasks;
  3. ما زلت لم أتفهم ما تحاول القيام به، المطلوب إرسال ملفات الكود فقط وليس إرسال مجلد البيئة الإفتراضية الذي به الحزم، ملفات الكود حجمها بسيط، وتستطيع استثناء المجلدات والملفات التي تريدها من الرفع على Github من خلال ملف gitignore تفقد التالي:
  4. AI take to much storage so it hard to create a portfolio for upwork and Baad, and the how I am going to sent you the final project of AI course because I dont think i can sent you since it take to much storage
  5. من الأفضل محاولة الحل لتحقيق استفادة، سأوضح لك الخطوات، لديك سلسلة نصية 'X-DSPAM-Confidence: 0.8475' استخدم ميثود أي دالة find لتحديد موقع النقطتين : في السلسلة، حيث سيتم إعادة الفهرس index للنقطتين في السلسلة. بمجرد معرفة موقع النقطتين، استخدم التقطيع slicing لاستخراج كل شيء بعد النقطتين، ستحتاج إلى أخذ موقع النقطتين وإضافة 1 لتخطي النقطتين نفسها واترك نهاية التقطيع فارغة لأخذ كل شيء حتى نهاية السلسلة. وستحصل على نص ' 0.8475' لاحظ المسافة أي الفراغ في النهاية بعد رقم 5، استخدم دالة strip() لإزالة أي مسافات فارغة من بداية ونهاية النص المستخرج. ثم استخدم دالة float() لتحويل السلسلة النصية الناتجة إلى رقم عشري بدلاً من نص " " وذلك لاستخدامه في العمليات الحسابية، فالنص لا نستطيع استخدامه في ذلك.
  6. ما هي المشكلة وما هو المشروع الذي تعمل عليه؟ هل تحاول رفع مشروع إلى GitHub؟ ستحتاج إلى إنشاء ملف gitignore. من أجل تجاهل مجلد البيئة الإفتراضية الذي به الحزم وعدم رفعه إلى المستودع.
  7. ai have a problem for taken to much storage, wich will cause many problems: how am I going to sent to you the test? how am I going to create a portfolio if github cannot handle more than 25MB?
  8. تمام جدا الف شكراا جدا لحضرتك جزاك الله كل خير
  9. Take the following Python code that stores a string:‘ str = 'X-DSPAM-Confidence: 0.8475' Use find and string slicing to extract the portion of the string after the colon character and then use the float function to convert the extracted string into a floating point number.
  10. وعليكم السلام ورحمة الله وبركاته. الحل صحيح في بعض الحالات ولكن في حالات أخرى خاطئ لهذا فإن هذا الحل لن يتم قبوله على الموقع . لاحظ أنك لا تقوم بالتأكد من الرقم هل هو موجب أم سالب . حيث إذا كان سالبا لا يجب وضعه في المجموع لديك . أيضا لاحظ أنك تقوم بتكرار الكود هو هو مرتين مرة في else ومرة بداخل if الإختلاف هو فقط في إذا كان تم حذف القيم الفريدة أم لا من خلال إستخدام set. لهذا يمكنك فقط وضع جزء واحد من الكود وتحويل set مباشرة . لهذا قم بتحويل المصفوفة إلى set مباشرة ومن ثم التكرار على عناصر set الجديدة وجمع الرقم إذا كان موجبا وعدم جمعه إذا كان سالبا.
  11. تمام جدا الف شكراا جدا لحضرتكم جزاكم الله كل خير
  12. وعليكم السلام ورحمة الله، عند استخدام هذا السطر: for num in set(array): سيتم التكرار عبر العناصر بترتيب عشوائي على سبيل المثال، إذا كانت مصفوفة الأعداد هي: [2, -1, 3, -1] فإن ترتيب واحد مثل [2, -1, 3] قد يعطي مجموعا تراكميا 2 ،1 ، 4 بإجمالي 4 بينما ترتيب آخر مثل [2, 3, -1] قد يعطي 2 ، 5 ، 4 بإجمالي 5. وأيضا عندما توجد أعداد موجبة، الاستراتيجية المثلى هي استبعاد الأعداد السالبة لأن وجودها يقلل من المجموع الكلي في هذه المشكلة، إذا كان هناك عدد موجب واحد على الأقل، يمكنك دائما حذف الأعداد السالبة بحيث يكون المجموع الأمثل هو مجموع كل الأعداد الموجبة المميزة (الصفر لا يؤثر على المجموع) في حلّك قد تتم إضافة بعض الأعداد السالبة من المجموعة مما يقلل من المجموع. وبما أنه مسموح لك بحذف أي عناصر، يمكنك دائما تشكيل مصفوفة فرعية (Subarray) تحتوي على كل عدد مفيد (أي موجب) مرة واحدة فقط. الحل الأمثل هو: إذا كان هناك عدد موجب على الأقل: احسب مجموع جميع الأعداد الموجبة المميزة. إذا لم توجد أعداد موجبة: قم بإرجاع أكبر عنصر أي العدد "الأقل سلبية".
  13. الحل غير صحيح، المطلوب إيجاد أكبر مجموع لـ subarray متتالي أي عناصر متجاورة في المصفوفة الأصلية بحيث، جميع عناصر الـ subarray فريدة ويُسمح بحذف أي عدد من العناصر من المصفوفة الأصلية لكن يجب أن يبقى الsubarray متتاليًا بعد الحذف. لكل قيمة فريدة في المصفوفة، تتبع الحد الأقصى لتكرار تلك القيمة، وتستطيع ببساطة تخزين القيمة الفريدة نفسها وكأنها الحد الأقصى لتكرارها، وانتبه إلى أنّ تتبع الحد الأقصى للتكرار لا يعني عد مرات الظهور بالمعنى الحرفي، بل التعامل مع كل قيمة فريدة مرة واحدة فقط، واختيار القيمة نفسها كممثل لها. ثم جمع الحدود القصوى لتكرارات كل قيمة فريدة فقط إن كانت موجبة، ولو المصفوفة تحتوي فقط على قيم سالبة أو صفر، ستقوم بإرجاع العنصر الأكبر في المصفوفة الأصلية. كالتالي: class Solution: def maxSum(self, nums): max_sum = 0 current_sum = 0 unique_elements = set() left = 0 for right in range(len(nums)): while nums[right] in unique_elements: unique_elements.remove(nums[left]) current_sum -= nums[left] left += 1 unique_elements.add(nums[right]) current_sum += nums[right] if current_sum > max_sum: max_sum = current_sum return max_sum if max_sum != 0 else max(nums) وتلك نسخة أقصر من الكود: class Solution(object): def maxSum(self, nums): ans = 0 for num in set(nums): if num > 0: ans += num return ans if ans else max(nums)
  14. نستخدمها لمعالجة البيانات النصية وليس الصور، بالتالي لو مجموعة البيانات تحتوي على مسارات الصور images/cat1.jpg وتسمياتها "cat" في ملف CSV أو Excel، فاستخدم Pandas لقراءة القائمة. بعد ذلك، تمرر المسارات إلى tf.data أو DataLoader لتحميل الصور الفعلية ومعالجتها.
  15. Kadane's Algorithm هي خوارزمية خطية تستخدم لإيجاد أكبر مجموع لمصفوفة فرعية في مصفوفة معينة تعرف المصفوفة الفرعية بأنها مجموعة متصلة من العناصر داخل المصفوفة وتتعامل الخوارزمية بفاعلية مع الأرقام الموجبة والسالبة، مما يجعلها أداة متعددة الاستخدامات لحل العديد من المشكلات المتعلقة بالمصفوفات الفرعية. تعتمد الخوارزمية على منهج البرمجة الديناميكية من خلال حساب أكبر مجموع متصل ينتهي عند كل عنصر في المصفوفة والفكرة الأساسية هي مقارنة العنصر الحالي بأكبر مجموع متصل سابق، وتحديث القيم بناء على ذلك ولتنفيذها نقوم بالتالي أولا نقوم بتهيئة متغيرين: max_so_far: أكبر مجموع متصل تم العثور عليه حتى الآن. max_ending_here: المجموع المتصل الحالي. ثم نمرر على كل عنصر في المصفوفة من خلال إضافة العنصر الحالي إلى max_ending_here فإذا كان max_ending_here أقل من الصفر، نقوم بإعادة ضبطه إلى صفر، ونقوم بتحديث max_so_far إذا كان max_ending_here أكبر منه. وعند الانتهاء من المرور على المصفوفة، سيحتوي max_so_far على أكبر مجموع متصل على هذا النحو: public class KadaneAlgorithm { public static int maxSubarraySum(int[] arr) { int max_so_far = Integer.MIN_VALUE; int max_ending_here = 0; for (int i = 0; i < arr.length; i++) { max_ending_here += arr[i]; if (max_ending_here < 0) { max_ending_here = 0; } if (max_so_far < max_ending_here) { max_so_far = max_ending_here; } } return max_so_far; } public static void main(String[] args) { int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; int maxSum = maxSubarraySum(arr); System.out.println("أكبر مجموع متصل هو: " + maxSum); } } ثم الإخراج سيكون: أكبر مجموع متصل هو: 6 وهو ناتج جمع [4, -1, 2, 1]. أما بالنسبة للتعقيد الزمني لهذه الخوارزنية فهو O(n) حيث n هو عدد عناصر المصفوفة.
  16. السلام عليكم دي المساله You are given an integer array nums. You are allowed to delete any number of elements from nums without making it empty. After performing the deletions, select a subarray of nums such that: All elements in the subarray are unique. The sum of the elements in the subarray is maximized. Return the maximum sum of such a subarray. ودي الحل بتاعي هل يوجد افضل من كده max_sum = float('-inf') current_sum = 0 if len(array) != len(set(array)): for num in set(array): current_sum += num max_sum = max(max_sum, current_sum) if current_sum < 0: current_sum = 0 else: for num in array: current_sum += num max_sum = max(max_sum, current_sum) if current_sum < 0: current_sum = 0
  17. تمام جدا الف شكراا جدا لحضرتك جزاك الله كل خير
  18. تلك خوارزمية لحل مشكلة أقصى مجموع جزئي أو أكبر مجموع فرعي متجاور Maximum Subarray Problem، وذلك لإيجاد المجموع الأعظمي لتسلسل فرعي متجاور ضمن مصفوفة أحادية البعد تحتوي على أرقام قد تكون موجبة أو سالبة. تحتفظ الخوارزمية بمتغيرين max_so_far يمثل أقصى مجموع تم العثور عليه حتى الآن، و max_ending_here يمثل أقصى مجموع ينتهي عند العنصر الحالي. ثم تمر عبر عناصر المصفوفة: لكل عنصر، تضيف قيمته إلى max_ending_here. وإن أصبح max_ending_here سالبًا، تعيد تعيينه إلى الصفر لأن البدء من جديد أفضل من الاستمرار بمجموع سالب. ثم تحديث max_so_far في حال max_ending_here أكبر منه. بعد الإنتهاء تعيد max_so_far كنتيجة. وذلك مثال من خلال جافاسكريبت: let array = [-2, 1, -3, 4, -1, 2, 1, -5, 4] function maxSubArray(array) { let current_sum = array[0] let max_sum = array[0] for (let i = 1; i < array.length; i++) { current_sum = Math.max(array[i], current_sum + array[i]) if (current_sum > max_sum) { max_sum = current_sum } } return max_sum } console.log(maxSubArray(array))
  19. نناقش اليوم عدة طرق لتحديث خوادم أوبنتو تلقائيًا والاستفادة من ذلك في حماية الخوادم من الأخطاء والثغرات الأمنية وضمان عملها بأمان وموثوقية، وسنوضح استخدام بعض الأدوات والإعدادات التي تسهّل علينا إدارة تحديثات الخوادم وتصحيحها وإعادة تشغيلها، فإجراء تلك الأمور يدويًا أمر مرهق لمدير النظام وقد يتسبب بوقوع أخطاء. يشمل مقالنا ثلاثة أقسام: أفضل ممارسات إدارة التطبيقات لضمان إعادة تشغيلها بشكل صحيح بعد التحديث إعدادات الترقية التلقائية للمكتبات والحزم العاملة على الخادم التحديث والتصحيح المباشر لنواة النظام متطلبات العمل نحتاج خادم يعمل بنظام التشغيل أوبونتو، مع مستخدم عادي غير المستخدم الجذر root لكنه يتمتع بصلاحيات عالية sudo لتشغيل الأوامر الإدارية عند الحاجة، ويمكن تجهيز المطلوب باتباع خطوات مقال التهيئة الأولية لخادم أوبونتو. أفضل ممارسات إدارة التطبيقات عند ترقية الخادم، ستراودنا مخاوف أساسية تتعلق باستمرارية عمل التطبيقات بعد التحديث وإعادة التشغيل مثل كيف ستعمل تطبيقاتنا بعد ترقية الخادم؟ وهل سيعود الخادم لسلوكه الطبيعي بعد إعادة التشغيل اللاحقة للترقية؟ تشكل هذه الأسئلة هاجسًا لأي مدير النظام يسعى لتحديث خادمه وقد تجعله يتخلى عن قرار الترقية. كما سنحتاج للإجابة على هذه التساؤلات عند ضبط إعدادات الترقية التلقائية automatic upgrades على الخوادم ونتأكد من إعادة تشغيل جميع التطبيقات العاملة على الخادم بصورة سليمة بعد أي إعادة تشغيل أو توقف مفاجئ، علمًا أن أدوات إدارة حزم لينكس مصممة في الأساس لتعمل في الخلفية دون عرقلة أو أعباء صيانة إضافية على الخادم. نظريًّا ينبغي أن تُدار جميع التطبيقات العاملة على الخادم باستخدام نظام التمهيد init system ما أمكن ذلك، و systemd هي أداة التمهيد الرئيسية في أوبنتو وفي معظم توزيعات لينكس الأخرى حيث تتيح التفاعل مع الخدمات العاملة على الخادم وإعادة تشغيلها تلقائيًا حسب الحاجة باستخدام الأمر systemctl، بناءً على ذلك فإن أي برنامج مثبت على الخادم ويعمل في الخلفية سيأتي تلقائيًا مع خدمة systemd لإدارته. بالإضافة إلى ذلك، سينشأ ملف إعدادات خاص يسمى ملف إعدادت الوحدة unit file يحتوي على تعليمات تحدد كيفية تشغيل الخدمة وإيقافها وإدارتها بواسطة systemd. أما إذا كنا نشغل تطبيقًا خاصًا طورناه بنفسنا أو تطبيقًا ثبَّناه من مستودعات Git لا يتضمن ملف تمهيد للتكامل مع systemd، وسيصعب كتابة الملف يدويًّا ولن تكون نتائجه مضمونة، لذا يلجأ مدراء الأنظمة لاستخدام أدوات خاصة بإدارة التطبيقات مثل مدير العمليات supervisor لتوفير الوقت والجهد والاستغناء عن كتابة ملفات التمهيد يدويًا، كما يمكننا أيضًا استخدام جدولة المهام بواسطة cron مع الصيغة reboot@ لأتمتة العملية. ويمكن إعادة التشغيل باستخدام الأمر Sudo Shutdown now -r الذي يوقف جميع العمليات العاملة ويعيد تشغيل النظام مباشرةً، كما يمكننا جدولة إعادة التشغيل لتجري في وقت لاحق في ساعة ودقيقة معينة hh:mm بدل إعادة التشغيل الفوري، علمًا أن جميع الخدمات ونقاط الوصول endpoints الضرورية في بيئة الإنتاج ينبغي أن تعود للعمل بعد أي انقطاع طارئ. بعد أن عرضنا الطرق التي يمكن استخدامها لضمان إعادة تشغيل سليمة لجميع الخدمات أثناء عمليات الصيانة، لننتقل لشرح طريقة جدولة التحديثات التلقائية. إعدادات الترقية التلقائية يبدأ مدير حزم أوبنتو apt عمله بتحديث حزم النظام باستخدام apt update ثم ترقيتها بواسطة apt Upgrade التي ستعمل على ترقية جميع الحزم دون استثناء لأننا لم نحدد حزمة بعينها، تستخدم صيغة الأوامر هذه في الحالة المثالية لكنها ستختلف قليلًا وتتطلب إعدادات أكثر إذا كنا نستخدم حزمًا من مستودعات طرف ثالث غير مستودعات أوبنتو ونخشى من تعارضها مع حزم مستودعات أوبنتو، أو إذا كنا نحتفظ عمدًا بإصدارات محددة من بعض الحزم ولا نود ترقيتها لأنها تتوافق مع تطبيقاتنا مثلًا. يوفر أوبنتو أداة فريدة لتثبيت التصحيحات الأمنية patches والترقيات الأخرى غير المُراقبة التي لا تحتاج إلى تدخل بشري لإنجازها، تسمى unattended-upgrades وهي مثبتة تلقائيًا في معظم خوادم أوبنتو، ويمكن تثبيتها يدويًا باستخدام أوامر apt التالية: $ sudo apt update $ sudo apt install unattended-upgrades يمكن التأكد من عمل الخدمة unattended-upgrades باستخدام systemctl كما يلي: $ sudo systemctl status unattended-upgrades.service إذا كانت الخدمة تعمل، سنحصل على خرج يشبه التالي: unattended-upgrades.service - Unattended Upgrades Shutdown Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-02-14 17:51:49 UTC; 3h 4min ago Docs: man:unattended-upgrade(8) Main PID: 829 (unattended-upgr) Tasks: 2 (limit: 1137) Memory: 10.6M CGroup: /system.slice/unattended-upgrades.service ستعمل الأداة unattended-upgrades بإعداداتها الافتراضية على تثبيت كافة الإصلاحات والتحديثات المتوفرة للحزم التابعة لمستودعات أوبنتو، أما إذا كنا نستخدم إصدارات أقدم من بعض الحزم وأردنا تجنب التعديلات على المستودع الأولي upstream changes أو كان خادمنا يستخدم مستودعات طرف ثالث تتبع لجهات خارجية إلى جانب مستودعات أوبنتو فسنحتاج عندها لتعديل إعدادات unattended-upgrades الافتراضية وضبطها بطريقة مختلفة. تُخَزَّن إعدادات هذه الأداة في الملف ‎/etc/apt/apt.conf.d/50unattended-upgrades ويمكننا فتحه وتحريره بواسطة أي محرر نصوص مثل نانو nano أو غيره كما يلي: $ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades بمجرد فتح الملف، سنلاحظ أنه سهل القراءة ومشروح جيدًا، ويتضمن مجموعة من التعليقات التي تشرح التعليمات البرمجية ووظائفها، تتضمن كتلة التعليمات الأولى في الملف أسماء الحزم التي ستُحَدِّثها الأداة تلقائيًا ولها القالب العام لأسماء مستودعات حزم أوبنتو، وهي افتراضيًا ملفات المستودع المركزي core repository وملفات مستودع الحماية security-، أما مستودعات updates- و proposition- و backports- فتحديثها مُعطّل افتراضيًا ويُترك للمستخدم حرية تفعيلها من عدمه، لأنها قد تتضمن تعديلات جذرية على حزم النظام لذا نجد أن أسطرها تبدأ برمز التعليق //، ويمكن إزالته إن رغبتنا بتفعيل التحديثات التلقائية لها. إذا تابعنا تصفح الملف، سنجد عددًا من الأسطر التي يمكن التحكم بخياراتها باستخدام true أو false، على سبيل المثال يوجد خيار خاص بتفعيل إعادة التشغيل التلقائية بعد تثبيت الحزم التي تتطلب إعادة تشغيل كي تتفعل وتدخل حيز التنفيذ، يمكن تفعيل هذا الخيار بإزالة رمز التعليق // وتبديل القيمة false إلى true، لكن اتخاذ قرار كهذا سيعرضنا لانقطاعات غير متوقعة في الخدمة نتيجة إعادة التشغيل وينبغي أن تكون طبيعة تطبيقاتنا قادرة على تحمل التبعات الناتجة عن ذلك. // Automatically reboot *WITHOUT CONFIRMATION* if // the file /var/run/reboot-required is found after the upgrade //Unattended-Upgrade::Automatic-Reboot "false"; بعد الانتهاء من إجراء التعديلات، نحفظ التغييرات على الملف ونغلقه بالخطوات التي تناسب محرر النصوص المستخدم ففي nano مثلًا نضغط على Ctrl+X ثم Y وبعدها Enter. والآن نعيد تشغيل الخدمة unattended-upgrades وفق الأمر التالي لتصبح التعديلات سارية المفعول: $ sudo systemctl restart unattended-upgrades.service بهذا نكون قد انتهينا من شرح طريقة ضبط التحديثات الأمنية التلقائية لحزم النظام لتعمل تلقائيًا دون تدخل منا، سنناقش في الفقرة التالية تحديث نواة النظام والتعامل مع الحالات التي تقتضي إعادة التشغيل. التحديث والتصحيح المباشر لنواة النظام نواة نظام لينكس هي الجزء الأساسي من المظام حيث تحتوي على تعريفات معظم الأجهزة كالمعالج والذاكرة والطابعة وغيرها، وهي المسؤولة عن التفاعل منخفض المستوى بين العتاد الصلب والبرامج، وتصدر تحديثاتها بتواتر أقل من تحديثات الحزم الأخرى، وعادةً ما ترتبط بظهور ثغرة أمنية خطيرة ينبغي معالجتها، أو ظهور ميزة جديدة، وقد تكون ضرورية أيضًا في الحالات التي تصبح فيها النواة قديمة جدًا لدرجة نخشى معها وجود ثغرات أمنية وأخطاء متراكمة لا علم لنا بها. لا توجد منهجية جاهزة لجدولة تحديثات نواة نظام لينكس بصورة تلقائية فهذا الأمر يختلف من حالة لأخرى، فتحديثات النواة تتطلب إعادة تشغيل كاملة للنظام، ومنطقيًا لا يمكن جدولة أمر كهذا دون أخذ بيئة التشغيل الخاصة بكل خادم والخدمات التي يقدمها بالحسبان، فبعض الخوادم ينبغي أن تعمل على مدار اليوم والساعة دون انقطاع، وبعضها قد يأخذ وقتًا طويلًا لا يمكن التكهن به في إعادة التشغيل، أو قد يتطلب تدخلًا يدويًا لإتمام العملية أو غير ذلك، لذا لا يمكن جدولة التحديث ليجري تلقائيًا دون علم المستخدم وموافقته. أما إذا كنا لا نمانع بإجرائها تلقائيًا مع ما يترتب عليها من فترات انقطاع في الخدمة، فيمكننا ضبط ذلك في إعدادات التحديثات غير المُراقبة unattended updates بواسطة apt ليجري تحديث نواة النظام وتثبيت إصدارتها الجديدة مع بقية الحزم، وسيستخدم خادمنا النواة الجديدة المُحَدَّثة تلقائيًا بعد إعادة التشغيل، لكن عادةً ما يلجأ مديرو النظام في بيئات التشغيل الحقيقية لأساليب تضمن استمرارية تقديم الخدمة للعملاء مثل استخدام موازن حمل يوجه حركة مرور البيانات إلى الخوادم البديلة أثناء إعادة تشغيل الخادم الذي يُحَدِّث نواته، وتكرار العملية مع بقية الخوادم بالترتيب ليكتمل تحديث المجموعة كلها دون أن يشعر المستخدم بالانقطاع. تفعيل التصحيح المباشر Livepatch لإبقاء الخادم يعمل عند تحديث النواة يوفر نظام لينكس ميزة مفيدة تدعى التصحيح المباشر live patching تسمح لنا بتحديث النواة kernel دون إعادة التشغيل، ويُشرف على التصحيحات المباشرة -وفق هذه الميزة- أداتان أساسيتان هما: Canonical الخاصة بأنظمة أوبنتو حصرًا KernelCare التي تدعم معظم توزيعات لينكس الشهيرة إلى جانب أوبنتو علمًا أننا نحتاج لتسجيل حساب على موقع كلتا الأداتين لاستخدامهما، وتوفر Canonical إمكانية التسجيل والاستخدام المجاني للأفراد. يمكن تسجيل الدخول إلى Canonical والحصول على مفتاح خاص بالتصحيح المباشرة من هذا الرابط، ويمكننا بعدها تثبيت الحزمة canonical-livepatch بواسطة snap -وهو مدير حزم آخر يعمل إلى جانب apt في أنظمة أوبنتو- كما يلي: $ sudo snap install canonical-livepatch ثم نكتب الأمر التالي لتفعيل الحزمة canonical-livepatch، ولا ننسى استبدال your-key بمفتاحنا الخاص الذي حصلنا عليه من موقع Canonical: $ sudo canonical-livepatch enable your-key بعد التنفيذ ستظهر رسالة واضحة تعلمنا بنجاح تثبيت الخدمة Successfully enabled device وبذلك ستصبح canonical-livepatch خدمة عاملة على نظامنا، وستعمل في الخلفية ويمكن التأكد من ذلك بالاستعلام عن حالتها بواسطة canonical-livepatch status كما يلي: $ sudo canonical-livepatch status سنحصل على خرج يشبه التالي: last check: 50 seconds ago kernel: 5.15.0-25-generic server check-in: succeeded patch state: ✓ all applicable livepatch modules inserted patch version: 84.1 tier: updates (Free usage; This machine beta tests new patches.) machine id: 2565a9e7fc9f4405a167e4caf9b9dcf3 بمساعدة هذه الأداة نكون قد ضبطنا التحديثات التلقائية لنواة نظامنا كي تحدث من دون تدخل يدوي، ودون الحاجة لإعادة تشغيل النظام لنحافظ بذلك على بيئة تشغيل آمنة ومُحَدَّثة لتطبيقاتنا. الخلاصة تعرفنا في هذا المقال على جانب أساسي من مهام مهندسي DevOps وهو تحديث الخوادم والتعامل مع التحديثات التي تتطلب إعادة تشغيل، وتعلمنا الفرق بين تحديث حزم أوبنتو وتحديث نواة النظام، ويمكن التعمق أكثر في إدارة أوبنتو ومهام DevOps الأخرى بتحميل كتاب دليل إدارة خوادم أوبنتو مجانًا من أكاديمية حسوب، ومطالعة مقالات قسم DevOps أيضًا على الأكاديمية. ترجمة -وبتصرف- لمقال How to Keep Ubuntu 22.04 Servers Updated لصاحبه Alex Garnett. اقرأ أيضًا أساسيات إدارة الملفّات والتنقّل في لينكس الدليل الكامل لاستخدام أوامر apt في نظام لينكس تثبيت لينكس مع نظام ويندوز كيفية تثبيت التطبيقات في لينكس
  20. السلام عليكم هي اي خوارزمية كادان ؟
  21. وعليكم السلام ورحمة الله وبركاته. بالتأكيد يجب أن تحول ملفات الصور إلى أرقام (مصفوفات رقمية) قبل تدريب شبكات CNN. فالشبكات العصبية التوافقية (CNNs) لا تستطيع التعامل مباشرة مع ملفات الصور كما هي، بل تحتاج إلى تمثيل رقمي للصور. ولكن لا تقوم بذلك يدوياً إنما عملية التحويل تتم عادة باستخدام مكتبات مثل TensorFlow أو PyTorch حيث توفر وظائف لتحميل ومعالجة الصور بشكل تلقائي، لكن التحويل من الصورة إلى تمثيل رقمي يحدث بالفعل.
  22. وعليكم السلام ورحمة الله وبركاته. لا تحتاج إلى تحويل الصور إلى أرقام يدويا قبل التدريب في CNNS.حيث هي مصممة بالفعل للتعامل مباشرة مع بيانات الصورة و تقوم تلقائيا بتحويل الصور إلى تمثيل رقمي (مصفوفات من الأرقام) كجزء من عملية المعالجة حيث المكتبات تقوم بهذه الخطوة تلقائيا. حيث الصورة يتم تمثيلها بشكل طبيعي كمصفوفة من الأرقام مصفوفة ثلاثية الأبعاد في حالة الصور الملونة (RGB) أو ثنائية الأبعاد في حالة الصور الرمادية حيث كل بكسل في الصورة له قيمة رقمية تمثل شدة اللون. وعند إدخال الصورة إلى الشبكة العصبية يتم تمرير هذه المصفوفة مباشرة كمدخل و لا تحتاج إلى تحويلها بنفسك إلى أرقام لأنها بالفعل في شكل رقمي.
  23. يجب أن تكون الصور في الأساس في صيغة بيانات رقمية قبل إدخالها إلى الشبكة، فالشبكة نفسها لا تقوم بتحويل الصور من شكلها الخام أي ملفات JPEG أو PNG إلى بيانات رقمية داخليًا من تلقاء نفسها، بل تعتمد على أن تكون البيانات جاهزة في شكل مناسب للمعالجة. وأنت لست بحاجة إلى القيام بذلك يدويًا، فالمكتبات المستخدمة لبناء وتدريب الشبكات العصبية وهي TensorFlow أو PyTorch تتولى تلك الخطوة تلقائيًا عند تحميل الصور. حيث أولاً تقوم بتحميل الصور باستخدام مكتبة pillow أو openCV ثم تحويلها إلى مصفوفات من خلال مكتبة numpy، بعد ذلك تهيئتها بواسطة tensorflow بضبط أبعاد الصورة لتتناسب مع مدخلات الشبكة والتهيئة Normalization بتحويل قيم البكسلات من النطاق [0, 255] إلى [0, 1] أو أي نطاق آخر، والتعامل مع القنوات للتأكد من ترتيب القنوات RGB حسب ما تتطلبه الشبكة. لكن في حال البيانات الكبيرة كآلاف الصور لن نقوم بذلك بالطريقة السابقة، فلديك مكتبة PyTorch والتي توفر أدوات لتحميل البيانات من خلال دفعات batches ومعالجتها تلقائيًا، أو من خلال tf.keras.utils.image_dataset_from_directory مع tf.data من مكتبة TensorFlow وهي الطريقة الأسهل لتحميل الصور من المجلدات وإنشاء مجموعات بيانات datasets.
  24. وعليكم السلام ورحمة الله وبركاته. إذا كنت تريد عكس إتجاه النص وليس عكس النص نفسه أى يظهر من اليمين إلى اليسار في notepad . يمكنك الضغط على CTRL + SHIFT من جهة يسار لوحة المفاتيح لجعل إتجاه النص من اليسار . أو نفس الزرين من جهة يمين لوحة المفاتيح لجعل النص من اليمين إلى اليسار . أما إذا أدرت عكس الكلمات نفسها والأحرف .فأولا يوجد لديك مشكلة حيث يجب إستبدال &lt;LSTag ب <LSTag ليصبح النص لديك هكذا : بعد تسجيل <LSTag Tooltip="CriticalHit">ضربة حرجة</LSTag>، استخدم <LSTag Type="ActionResource" Tooltip="BonusActionPoint">إجراء المكافأة</LSTag> لإجراء هجوم إضافي.</content> لأنك كنتَ بحاجةٍ للتحدث عنه. لأنه يبدو... صحيحًا. مناسبًا. ويمكنك عكس النص كما تريد الآن.
  1. عرض المزيد
×
×
  • أضف...