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

Mustafa Suleiman

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

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

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

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

    365

كل منشورات العضو Mustafa Suleiman

  1. الثغرة الأمنية هي أي عيب في البرنامج يمكن أن يستغله المهاجم للوصول غير المصرح به إلى النظام أو سرقة البيانات أو تدمير الملفات أو تنفيذ تعليمات ضارة أخرى. أي هي أخطاء أو عيوب في التصميم أو التنفيذ غير مقصودة بالطبع تتيح للمهاجمين الوصول غير المشروع إلى النظام أو تنفيذ أنشطة غير مصرح بها، وقد تسبب الثغرات في تعطيل البرنامج أو تنفيذ أوامر خبيثة أو أن يصبح النظام أكثر عرضة للهجمات. هناك عدة أنواع من الثغرات وأسبابها، ومنها: ثغرات البرمجة تنشأ نتيجة أخطاء في كتابة الشفرة البرمجية، مثل استخدام غير صحيح للمتغيرات أو عمليات غير صحيحة تؤدي إلى سلوك غير متوقع، ومن الأمثلة الشهيرة على ذلك ثغرة "قلب الأمر" (Heartbleed) في بروتوكول OpenSSL الذي كان يسمح للمهاجمين بسرقة بيانات الذاكرة. ثغرات التصميم تحدث بسبب سوء التخطيط أو التصميم العام للبرمجيات، مما يجعلها عرضة للاختراق، مثال على ذلك ثغرة "المصعد" (Elevator) حيث يمكن للمستخدم الوصول إلى مستويات غير مخول له. ثغرات الأمان تنشأ نتيجة عدم تنفيذ ممارسات أمان قوية، مما يسمح للمهاجمين بالاختراق والوصول إلى المعلومات الحساسة، مثلاً، ثغرات في الاستجابة البينية لمواقع الويب قد تسمح للمهاجمين بتنفيذ هجمات حقن الشيفرة (Code Injection)، مثل هجمات SQL Injection. وهناك العديد من الطرق المختلفة لاكتشاف الثغرات الأمنية، بما في ذلك: اختبار الاختراق Penetration Testing وهي عملية تقييم النظام الأمني عن طريق محاكاة هجوم من قبل المهاجم. تحليل الكو وهي عملية مراجعة الكود المصدري للبرنامج بحثًا عن الأخطاء أو العيوب التي يمكن استغلالها. يمكن للمستخدمين الإبلاغ عن الثغرات الأمنية التي يجدونونها إلى الشركة المصنعة أو المطور. وفي بعض الأحيان يحدث أن يتم اكتشاف الثغرة بالصدفة من قبل مستخدم عادي أو مخترق ما، والأمر راجع له في حال أراد التبليغ عن تلك الثغرة أو استغلالها لمصالحه الشخصية، لكن ذلك يعرضه للمسائلة القانونية بالطبع. وفي بعض الدول العربية، في حال لم يوجد برنامج مكافآت أو نظام للإبلاغ عن الثغرات، فستتعرض للمسائلة القانونية لأنك اكتشتف ثغرة وحاولت إختراق الموقع!! بدلاً من أن يتم شكرك مكافأتك. وهناك أشخاص وظيفتهم هي البحث عن الثغرات والتكسب منها من خلال برامج المكافآت Bug Bounty Programs التي تعلن عنها الشركات، مثلاً في فيسبوك تحسب المكافآت المالية بناءًا على خطورة الثغرة: منخفضة 500 دولار متوسطة 1000 دولار عالية 5000 دولار حرجة 10000 دولار وهناك شركات تقدم مكافآت أعلى.
  2. أولاً لا تترك بلدك أبدًا لتبحث عن عمل في دولة غريبك عنك، بل عليك باكتساب الخبرة في بلدك ثم التقدم للوظائف المعروضة في الدول العربية أو الأجنبية ثم الحصول على عقد عمل، وكلمة السر هي عقد عمل، فبدونه ستعاني وستواجه الكثير من المشاكل، ويجب أن يكون عقد العمل به المسمى الوظيفي الخاص بوظيفتك التي تريد العمل بها وليس وظيفة أخرى. وفي مجال البرمجة، لست بحاجة إلى العمل في شركة ببلدك من أجل اكتساب الخبرة، حيث تستطيع التعلم والعمل بشكل حر أو تنفيذ العديد من المشاريع بمفردك واكتساب الخبرة ولكن يجب أن تكون مشاريع حقيقية مشابهة لأرض الواقع، وبعد سنة من الخبرة تستطيع التقدم للوظائف المعروضة عن بعد أو يمكنك السفر في حال كان ذلك متوفر. وتستطيع البحث على مواقع مثل LinkedIn و Indeed و منصة بعيد، ومواقع مثل weworkremotely.
  3. كلاهما مطلوبان في سوق العمل، حيث ستجد أن يتم طلب Django تحت مسمى Full Stack Developer أي ستعمل على تطوير الواجهة الأمامية والخلفية كمطور بايثون وقد يتم طلب React أيضًا لتطوير الواجهة الأمامية، أو أحيانًأ يتم طلب Django تحت مسمى وظيفي Backend Developer وستجد أنه مطلوب مثلاً (Django/PostgreSQL) للواجهة الخلفية. أما Laravel فهى بالطبع الأكثر طلبًا سواء على مواقع العمل الحر أو في الشركات، ويتم الإعتماد على إطار لارافل بشكل أكبر في إنشاء المواقع مقارنًة بـ Django. وأفضل طريقة لمعرفة ذلك، هي بالبحث بالكلمات المفتاحية على مواقع التوظيف مثل LinkedIn والبحث بكلمات مثل "Django, Back-End developer, python developer, Laravel developer , PHP developer". وأيضًا اتجه إلى مواقع العمل الحر التي تريد العمل عليها، وأنشيء حساب وتصفح المشاريع والمهارات المطلوبة وما هي اللغة والإطار الأكثر طلبًا، وبعدها اتخذ قرارك بناءًا على المطلوب في سوق العمل فعلاً.
  4. التنبيه "DevTools failed to load source map: Could not load content for chrome-extension://pejiikdiikindfooppgaidccahalenih/webspeed.js.map: System error: net: ERR_BLOCKED_BY_CLIENT" يعني خطأ في تحميل خريطة المصدر (source map) في جوجل كروم، وتعرف خريطة المصدر بأنها ملف يرتبط بملف JavaScript وتساعد في تحسين عملية تصحيح الأخطاء وتصفح الشيفرة المصدرية عند تطوير الويب، ولكن، قد يحدث خطأ في تحميل خريطة المصدر أحيانًا، مما يؤدي إلى ظهور رسالة الخطأ التي رأيتها. وتُبيّن الرسالة أنه لم يتمكن من تحميل محتوى خريطة المصدر من مسار الامتداد (extension) في جوجل كروم بعنوان pejiikdiikindfooppgaidccahalenih واسم الملف هو webspeed.js.map. أما System error: net: :ERR_BLOCKED_BY_CLIENT،تشير إلى أن الخطأ تم حظره بواسطة العميل، والعميل هنا يمثل امتداد مثبت على متصفح جوجل كروم يحميك من بعض السلوكيات غير المرغوب فيها على الإنترنت. وتعتبر خرائط المصدر (source maps) ملفات ضرورية للمطورين أثناء التطوير لكنها لا تؤثر على عمل الموقع أو التطبيق النهائي للمستخدمين العاديين، وتظهر تلك الرسالة للمطورين للإشارة إلى أن خريطة المصدر لهذا الامتداد قد فشلت في التحميل، وهي رسالة تحذيرية وليست ضارة بالضرورة، وبالطبع أنت لست مطور لتلك الإضافة وتستخدم متصفح جوجل كروم لتصفح الويب وتطوير موقعك بشكل عادي، ولذلك تلك الرسالة ليست مؤثرة وتستطيع تعطيل ظهورها كما أشار إليك قيس. وأنا مثلاً لدي تنبيهات مثلها تظهر بسبب إضافات المتصفح لدي: وتستطيع حذفها من خلال الضغط على الأيقونة التالية لحذف جميع الرسائل من الكونسول.
  5. باستطاعتك الإعتماد على خدمة Google Cloud Storage لإنشاء رابط Blob ذي صلاحيات محدودة، وإليك الخطوات: انتقل إلى لوحة القيادة في Google Cloud Platform. انقر فوق "خدمات". انقر فوق "تخزين Google Cloud". انقر فوق "حاوية". انقر فوق الحاوية التي يحتوي عليها الملف الذي تريد إنشاء رابط Blob له. انقر فوق الملف الذي تريد إنشاء رابط Blob له. في قسم "الروابط"، انقر فوق "إنشاء رابط". في نافذة "إنشاء رابط"، حدد الخيار "رابط Blob". في قسم "الصلاحيات"، حدد مستوى الوصول الذي تريد منحه للرابط. انقر فوق "إنشاء". سيتم إنشاء رابط Blob وسيتم عرضه في قسم "الروابط"، وتستطيع نسخ ذلك الرابط واستخدامه لعرض الملف على موقعك. وإليك مثال على رابط Blob ذي صلاحيات محدودة: https://storage.googleapis.com/my-bucket/my-file.mp4?access_token=YOUR_ACCESS_TOKEN وفي الرابط، تم تحديد مستوى الوصول إلى "القراءة فقط"، أي أن المستخدمين لن يتمكنوا من تنزيل الملف أو نسخه أو مشاركته. أيضًا بإمكانك استخدام API Google Cloud Storage لإنشاء رابط Blob ذي صلاحيات محدودة، كالتالي: curl -X POST \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "my-file.mp4", "generation": 1234567890, "contentType": "video/mp4", "accessControl": { "bucketPolicy": { "roles": { "roles/storage.objectViewer": [ "user:YOUR_USER_EMAIL" ] } } } }' \ "https://storage.googleapis.com/v1/b/my-bucket/o" والاستجابة من API Google Cloud Storage هي ردًا يتضمن رابط Blob ذي صلاحيات محدودة، وتستطيع نسخ الرابط واستخدامه لعرض الملف على موقعك. أو بإمكانك الإعتماد على موقع استضافة للفيديو مثل "فيمو" أو أي بديل آخر يناسبك، وأنت تحدد النطاق (الدومين) المسموح بأن تعمل عليه الفيديوهات، وهو نطاق موقعك الخاص، وتتم هذه العملية عن طريق ضبط إعدادات حساب استضافة الفيديو لديك ليتم قبول النطاق الخاص بك كنطاق موثوق به (trusted domain). أو هناك خيار آخر وهو استخدام تقنية DRM (إدارة الحقوق الرقمية) للحماية من المحتوى الخاص بك، وDRM هي تقنية تسمح لك بتقييد الوصول إلى المحتوى الخاص بك، بحيث لا يمكن للمستخدمين مشاهدته أو تنزيله إلا إذا كانوا مصرح لهم بذلك، وهناك العديد من حلول DRM المختلفة المتاحة، ويمكنك اختيار الحل الذي يناسب احتياجاتك الخاصة. وأرشح لك الخدمات التالية: https://www.brightcove.com/en/ https://www.vkrpt.com/ https://bunny.net/ https://www.vdocipher.com/ وتستطيع البحث عن Video streaming CDN يدعم خاصية DRM لكنه بالطبع مكلف أكثر، تستطيع البحث واختيار المزود المناسب للميزانية الخاصة بك.
  6. عليك بإضافة مستودع JitPack إلى إلى قسم repositories في ملف build.gradle: repositories { ... maven { url 'https://jitpack.io' } } ثم، تحتاج إلى إضافة تبعية FFmpegMediaMetadataRetriever إلى قسم dependencies في ملف build.gradle: dependencies { implementation 'com.github.wseemann.FFmpegMediaMetadataRetriever:FFmpegMediaMetadataRetriever-core:v1.0.15' } وفي حال أردت إضافة أي مستودع لمكتبة أخرى نتوجه إلى موقع https://jitpack.io ثم ألصق رابط المستودع الخاص بالمكتبة على GitHub وستظهر لك الإصدارات المتاحة ونضغط على get it وستجد الرابط بالأسفل: وتستطيع قراءة المستند الرسمي الخاص بالمكتبة في حال واجهتك مشكلة معينة: https://github.com/wseemann/FFmpegMediaMetadataRetriever
  7. عليك بالتسويق في البداية في المجموعات المهتمة بذلك النوع من المنتجات على الفيسبوك، وأيضًا الـ Market Place الخاص به، وأيضًا حاول تكوين مجموعة على التيليجرام لتكوين قاعة عملاء وإغرائهم بخصم لكل من يشترك في المجموعة. أيضًا حاول إنشاء صفحة على الفيسبوك وكتابة محتوى مفيد والتسويق للمنتجات الخاصة بك، أو حاول كتابة محتوى مفيد في المجموعات المهتمة بذلك. بالإضافة إلى إنشاء مدونة على المتجر وكتابة محتوى مفيد حقًا يبحث عنه من يهتم بمنتجاتك ولا يجب أن يقل المحتوى عن 1000 كلمة وتكون مفيدة وليست حشو بدون داعي. وأرى أن المتجر الخاص بك باللغة الأجنبية، فهل أنت تستهدف دولة كندا؟ عليك بتفقد ما هي المنصات والبرامج التي يعتمد عليها عملائك ثم حاول تكوين قاعدة عملاء من خلالها كما أشرت إليك، والأمر بطيء بالطبع وبحاجة إلى وقت ونفس طويل.
  8. ما هو الخطأ الذي يظهر لك، يجب تحديد الخطأ لحل المشكلة، وربما لديك تعارض في إصدارات الحزم conflict peer dependencies ولحل المشكلة، عليك باستخدام مؤشر أو --legacy-peer-deps عند التثبيت أي كالتالي: npm i --legacy-peer-deps والسبب أنه بعض الأحيان، يكون من الصعب تثبيت حزم معينة بسبب تبعيات النظائر القديمة، وقد يحدث ذلك عندما تكون الحزمة الأصلية معتمدة على نسخة محددة من حزمة، ولكن نسخة أحدث من تلك الحزمة مثبتة بالفعل ويتعارض ذلك مع التبعية. ومن الأفضل استخدام الحزم المتوافقة مع بعضها، من خلال تحديث الحزم من خلال تشغيل حزمة npm-check-updates بالأمر التالي: npx npm-check-updates وسيتم تحديث إصدارات الحزم في ملف package.json والآن عليك بالتثبيت من خلال الأمر npm i. ولكن انتبه إلى أن تحديث الحزم إلى آخر إصدار قد يتعارض مع الكود الخاص بمشروعك في حال كانت الإصدارات الجديدة تتطلب تعديل على الكود.
  9. كل الدول جيدة للعمل في مجال البرمجة، أما إذا كان السؤال بخصوص الشركات ذات الراتب وبيئة العمل التي تراها على مواقع التواصل وخلافه، فستجد ذلك في الدول الأوروبية وأمريكا، وبالطبع دول الخليج ستجد رواتب مرتفعة لكن بيئة العمل ليست الأفضل لكن الأفضل في المنقطة العربية على الأقل. وعليك بتخصيص سؤالك لتحصل على إجابة أفضل، وأيضًا هناك بعض الدول التي بها صناعات في البرمجة مثل صناعة الألعاب لذلك هي أفضل من غيرها، وأيضًا هناك بعض الدول الأوروبية رواتبها منخفضة مقارنًة بدول أخرى وأمريكا الرواتب بها أعلى، لكن الدول الأوروبية أفضل في رأي.
  10. الخوارزمية الأساسية للعبة XO في الوقت الفعلي باستخدام React، Node.js، وSocket.IO ستكون كالتالي: يجب أن يتم التواصل بين العميل (Client) والخادم (Server) باستخدام تقنية الـ WebSockets التي توفر اتصالًا ثنائي الاتجاه حي بين العميل والخادم، وبالطبع تستطيع استخدام Socket.IO لتبسيط عملية التواصل عبر WebSockets. اتصال العميل بالخادم: عند تحميل صفحة اللعبة على المتصفح، ينشئ إتصال Socket.IO بين العميل والخادم. إبلاغ الخادم باللاعبين: عندما ينضم اللاعبين إلى اللعبة، ترسل بيانات معرف الجلسة (Session ID) إلى الخادم باستخدام Socket.IO لإعلام الخادم بوجود اللاعبين. بدء اللعبة: يجب أن يكون لديك آلية لبدء اللعبة عند انضمام لاعبين كافيين (مثلاً حد أدنى لعدد اللاعبين). إدارة الحركات: عندما يقوم أحد اللاعبين بعمل حركة (وضع "X" أو "O" على اللوح)، ترسال تلك الحركة إلى الخادم باستخدام Socket.IO. الخادم يتحقق من صحة الحركة ويتحقق مما إذا كانت الخانة محجوزة بالفعل أم لا. في حال كانت الحركة صحيحة، يتم تحديث اللوح بالحركة الجديدة وإعلام العميل الآخر بالحركة الجديدة. التحقق من الفوز: بعد كل حركة، يجب على الخادم التحقق من ما إذا كان هناك لاعب فاز باللعبة. في حالة الفوز، يتم إعلام اللاعبين بالنتيجة وإيقاف اللعبة. إدارة نهاية اللعبة: إذا انتهت اللعبة بسبب الفوز أو التعادل أو أي سبب آخر، يتم إغلاق الاتصال بين العميل والخادم.
  11. هناك طريقتان لتحميل الصور على Google Colab، والأولى هي تحميل الصور من حاسوبك عن طريق التالي: انقر فوق رمز "ملف" في شريط الأدوات. حدد "تحميل". حدد الصور التي تريد تحميلها. انقر فوق "فتح". وسيقوم Google Colab بتحميل الصور إلى محرك الأقراص الخاص بك. والثانية هي تحميل الصور من Google Drive من خلال التالي: انقر فوق رمز "ملف" في شريط الأدوات. حدد "محرك الأقراص". حدد المجلد الذي يحتوي على الصور التي تريد تحميلها. انقر فوق "إضافة إلى colab". ولتثبيت مكتبة face-recognition، اتبع الخطوات التالية: في الخلية الأولى، اكتب الكود التالي، ولاحظ وجود علامة ! في البداية: !pip install face_recognition انقر فوق تشغيل الخلية. وسيعمل الكود على تثبيت مكتبة face-recognition على Google Colab، وإليك مثال على كيفية استخدام مكتبة face-recognition لتحديد الوجوه في الصور: import face_recognition # Load the image image = face_recognition.load_image_file("image.jpg") # Find all the faces in the image faces = face_recognition.face_locations(image) # Print the coordinates of the faces for face in faces: print(face)
  12. الأمر لا يمكن تخمينه بشكل جذافي هنا، بل عليك بتوكيل تلك المهمة إلى محاسب مختص بأمور الشركات أو محلل مالي مؤهل ومختص في التقييم المالي للشركات. فأنت ذكرت أن نسبتك هي 10% مما يعني أنه يوجد نسبة من الأرباح بقيمة 10% سنويًا ومن المفترض صرفها في حال مرور عام مالي. بعد ذلك يجب تصفية الشراكة ببيع نسبتك من الشركة وهي 10% ومن المفترض أن يتم تقييمها بناءًا على قيمة الشركة الحالية لا على القيمة التي دفعتها أنت. وهناك طريق آخر لكن لا أفضله، وهو الإتفاق على دفع مبلغ ترضاه أنت مقابل بيع حصتك بدون الأمور السابق ذكرها، أي مثلاً لو دفعت 100 ألف دولار، ورضيت بقيمة 300 ألف دولار مثلاً، فيتم بيع حصتك للطرف الآخر بناءًا على ذلك.
  13. ستحتاج أولاً إلى تعلم الأساسيات الخاصة بلغة برمجة تفضلها، وفي حال كان لديك الوقت الكافي والخبرة والاستيعاب فأنصحك بتعلم C++، وإذا واجهت صعوبة بعد المحاولة في تعلمها، فستجد بايثون الخيار الأمثل لك وهي الأسهل للمبتدئين الذين لا يمتلكوا أي خلفية عن علوم الحاسب والبرمجة، ولذلك تم شرح أساسيات في دورة علوم الحاسب. ولنفترض مثلاً أنك اخترت بايثون لتصبح لغة البرمجة الأولى لك، هنا لا تتسرع وتهرع إلى تعلم مهارة الـ Problem Solving بل عليك بالصبر والتعمق في لغة البرمجة الأولى لك ولا تحيد عنها، فكل ما تعلمته هي الأساسيات فقط. ويمكنك الاستزادة من خلال دراسة المسار الأول من دورة بايثون، وهو أساسيات لغة بايثون Python وهو متاح لك بشكل مجاني، وبالمثل المسار الأول من دورة جافاسكريبت أو حتى PHP وستجد شرح للأساسيات بشكل مفصل أكثر. ثم عليك بالبحث عن مشروع بايثون أو جافاسكريبت حتى للمبتدئين على اليوتيوب، ومتابعة الشرح ثم محاولة التطبيق بمفردك، وعليك بالتفكير في المشاكل التي تواجهك وكيفية حلها بالمعلومات المتوفرة لديك، وتقسيم المشكلة إلى أجزاء صغيرة ثم العمل عليها وهكذا، ولا تخف أبدًا من تعلم وتجربة أشياء جديدة فذلك هو المطلوب وذلك ما قصدته بالتعمق، وعليك بالبحث بعد التفكير فهو صديقك في رحلة تعلم البرمجة. وبعد الوصول إلى مستوى متوسط في لغة البرمجة الأولى لك، هنا تستطيع البدء في حل المشاكل والمسائل البرمجية على المواقع التي تم ذكرها لك ومنها codewars.com كما أشرت وأنا أفضله في البداية لكونه سهل الاستخدام وسهل للمبتدئين، وستجد على اليوتيوب شرح للمسائل الخاصة به أيضًا. وبتلك الخطوات ستتجنب الشعور بالإحباط بدون داعي، وستتمكن من تطوير مهاراتك البرمجية على أساس صحيح. وخصص لكل مسألة برمجية نصف ساعة إلى ساعة حسب صعوبة المسألة، ثم انظر للحل وتعلم منه وحاول الحل بمفردك، ثم انتقل للمسألة التالية، ولا تستغرق يوم كامل في حل مسألة مثلاً. وبالطبع عليك بالتدرج في حل المسائل من الأسهل للأصعب ولا تبدأ أبدًا بالمسائل الصعبة.
  14. يعتمد الرمز المستخدم لإعادة تشغيل جهاز التوجيه على نوع وموديل الجهاز، والرمز مختلف لكل جهاز، لذلك سأقدم لك نموذجًا عامًا يمكن أن يعمل على بعض الأجهزة، ولكن يجب عليك التأكد من أن الأمر يتوافق مع جهاز التوجيه الخاص بك. وقبل أن نستمر، يجب التأكد من أن جهاز التوجيه لديك يدعم إعادة التشغيل البعيدة عن طريق بروتوكولات مثل SNMP أو Telnet أو SSH، وإذا كان الجهاز لا يدعم تلك الخاصية، فلن يكون من الممكن تنفيذ إعادة التشغيل برمجيًا. وفيما يلي نموذج يستخدم بروتوكول Telnet لإعادة تشغيل جهاز التوجيه، ولاحظ أنه يجب تعيين معلومات الاتصال الصحيحة لجهاز التوجيه، بما في ذلك عنوان IP واعتمادات الدخول (اسم المستخدم وكلمة المرور) إذا كان لازم. Imports System.Net.Sockets Imports System.Text Public Class Form1 Private Sub RebootRouter() Dim ipAddress As String = "192.168.1.1" ' تغيير هذا إلى عنوان IP الصحيح لجهاز التوجيه الخاص بك Dim port As Integer = 23 ' افتراضياً يكون منفذ Telnet هو 23 Dim username As String = "اسم_المستخدم" ' تغيير هذا إلى اسم المستخدم الصحيح إذا كان اللازم Dim password As String = "كلمة_المرور" ' تغيير هذا إلى كلمة المرور الصحيحة إذا كان اللازم Try Dim client As New TcpClient(ipAddress, port) Dim stream As NetworkStream = client.GetStream() Dim data As Byte() = New Byte(1024) {} Dim bytes As Int32 = stream.Read(data, 0, data.Length) Dim response As String = Encoding.ASCII.GetString(data, 0, bytes) If response.Contains("login:") Then Dim login As Byte() = Encoding.ASCII.GetBytes(username + vbCr) stream.Write(login, 0, login.Length) bytes = stream.Read(data, 0, data.Length) response = Encoding.ASCII.GetString(data, 0, bytes) If response.Contains("Password:") Then Dim pass As Byte() = Encoding.ASCII.GetBytes(password + vbCr) stream.Write(pass, 0, pass.Length) bytes = stream.Read(data, 0, data.Length) response = Encoding.ASCII.GetString(data, 0, bytes) If response.Contains(">") Then Dim reboot As Byte() = Encoding.ASCII.GetBytes("reboot" + vbCr) stream.Write(reboot, 0, reboot.Length) End If End If End If stream.Close() client.Close() Catch ex As Exception ' ادرج هنا رمزًا للتعامل مع أي استثناء قد يحدث أثناء تنفيذ عملية إعادة التشغيل End Try End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click RebootRouter() End Sub End Class
  15. بالنسبة لقائمة التنقل Navbar فمن الأفضل جعل الشعار بحجم أكبر وأيضًا تجنب أن يكون الشعار عام جدًا وأعلم أنك ما زلت تتعلم لكن لمعلوماتك فقط، أي استخدم أيقونة مثلاً من موقع flaticon ولو بحثت عن travel ستجد الكثير من الأيقونات الجيدة حملها بصيغة PNG واستخدمها. أيضًا روابط التنقل يجب أن تكون ظاهرة للمستخدم، عليك بجعلها تظهر في المنتصف مثلاً مع تغيير اللون الخاص بالروابط، فعند تصميم واجهات المستخدم هناك نقطة هامة ألا وهي التباين Contrast فكما ترى هناك روابط تظهر بشكل غير واضح عليك بزيادة حجم الخط وإختيار اللون الأبيض لكل الروابط مثلاً، مع تغيير اللون قليلاً عند عمل Hover مثلاً. وتستطيع استخدام الأداة التالية من أجل قياس درجة التباين: https://coolors.co/contrast-checker/ffffff-4590e1 حيث يجب أن تكون على الأقل 5 وبإمكانك الضغط على enhance وإختيار تغيير لون الخلفية أو الخط من أجل تحسين التباين تلقائيًا لك. وبالنسبة لقسم Hero وهو القسم الرئيسي الذي يأتي بعد قائمة التنقل، حاول ضبط التسلسل الهرمي في التصميم hierarchy حاول البحث على اليوتيوب عن "التسلسل او الانسيابيه ( Hierarchy ) مبادئ التصميم" وستفهم ما أقصده وإليك مثال: بحيث يكون هناك فروق بين العنوان الرئيسي مع تسليط الضوء أيضًا على النص الذي تريد عرضه للزائر عند دخول الصفحة أسفل العنوان الرئيسي. وأيضًا من الأفضل ذكر شعور أو حالة مثلاً في نص الزر، مثل سافر معنا بدلاً من اتصل بنا. بالنسبة لباقي الأقسام حاول تجنب استخدام الظل بالألوان بتلك الطريقة، يكفي فقط وجود ظل باللون الأسود الخفيف وستجد هنا الكثير من الأمثلة التي يمكنك التعلم منها: https://getcssscan.com/css-box-shadow-examples
  16. لغة موجو Mojo هي لغة برمجة للأغراض العامة تم تطويرها بواسطة كريس لاتنر وModular Inc، وكريس لانتر هو مبتكر LLVM، وهي موجهة بشكل خاص لمجال تعلم الآلة، ولكن تستطيع استخدامها أيضًا لمجموعة واسعة من المهام الأخرى، مثل معالجة البيانات وتحويل البيانات. أما لغة بايثون هي اللغة الأكثر استخدامًا في مجال تحليل البيانات وتعلم الآلة، وهي معروفة بسهولة تعلمها واستخدامها، مما يجعلها خيارًا جيدًا للمبتدئين. بالإضافة إلى أنه يوجد لها العديد من الدورات والموارد التعليمية في كل مكان، بينما Mojo الموارد المتاحة لها قليلة لكون اللغة جديدة نسبيًا والموارد باللغة الإنجليزية فقط. والخلاصة هي: السرعة (Speed) لغة Mojo أسرع من Python. سهولة الاستخدام (Ease of Use) Python أسهل للتعلم ويمتلك منحنى تعلم أقل صعوبة. دعم المجتمع (Community Support) لغة Python لديها مجتمع أكبر وأوسع من دعم المجتمع بالمقارنة مع لغة Mojo. الوظيفية (Functionality) Python يحتوي على المزيد من المكتبات من طرف ثالث بالمقارنة مع لغة Mojo. التصميم (Designed for) لغة Mojo مصممة خصيصًا لتطبيقات تعلم الآلة والذكاء الاصطناعي، بينما تعتبر Python لغة عامة متعددة الاستخدامات. الأفضل لـ (Best for) لغة Mojo: تناسب المشاريع الصغيرة التي تتطلب أداءً عاليًا، والمطورين الذين يرغبون في تعلم لغة جديدة، والتطبيقات التي تعتمد على تحليل البيانات وتعلم الآلة والذكاء الاصطناعي. Python: تناسب المشاريع الكبيرة التي لا تحتاج إلى أداء عالي، وفريق العمل المعتاد على Python، والبرمجة متعددة الاستخدامات.
  17. من الأسهل لك أن تعتمد على مكتبة جافاسكريبت لترجمة الموقع، وأشهرها مكتبة i18next وتلك المكتبة توفر دعمًا شاملاً للترجمة وتحكم في النصوص والتنقل بين اللغات، ويمكن استخدامها في مشروع HTML/CSS/JS لديك وتتضمن خيارات مثل تحميل الملفات من الملقم أو استخدام خدمات الترجمة الآلية. يوجد أيضًا مكتبة Polyglot.js وهي مكتبة JavaScript صغيرة وخفيفة الوزن للترجمة، في حال كنت تبحث عن حلاً بسيطًا وغير معقد، فستجد Polyglot.js خيارًا جيدًا، وتم تطوير تلك المكتبة بواسطة Airbnb. وبالطبع ستحتاج إلى استخدم bundler (محزم) من أجل تجميع ملفات المشروع مثل Vite أو Webpack وفي حال أردت تسهيل الأمر تستطيع استيراد مكتبة مثل i18next عن طريق CDN من الرابط التالي: <script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/23.4.0/i18next.min.js" integrity="sha512-M4iruTNlnwfFL71Q+5fMOLe6gY3k6hq795GafcfVovObnhvz9h+DtaVdaP92Bjaai808vO8Iq5XPn9eW3VwVWw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> ثم قم بإنشاء ملفات الترجمة في مجلد اللغة العربية (ar.json): { "greeting": "مرحبًا بالعالم" } في مجلد اللغة الإنجليزية (en.json): { "greeting": "Hello, world" } HTML: <!DOCTYPE html> <html> <head> <title>مثال باستخدام i18next</title> </head> <body> <h1 id="greeting"></h1> <script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/23.4.0/i18next.min.js" integrity="sha512-M4iruTNlnwfFL71Q+5fMOLe6gY3k6hq795GafcfVovObnhvz9h+DtaVdaP92Bjaai808vO8Iq5XPn9eW3VwVWw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script> i18next.init({ lng: 'en', // يمكن تغييرها إلى 'ar' للعربية resources: { en: { translation: { "greeting": "Hello, world" } }, ar: { translation: { "greeting": "مرحبًا بالعالم" } } } }, function(err, t) { // تحميل النصوص بعد التهيئة updateContent(); }); function updateContent() { // تحديث النصوص في الصفحة باستخدام i18next document.getElementById('greeting').innerText = i18next.t('greeting'); } </script> </body> </html> ونفس الأمر بالنسبة <script src="https://cdnjs.cloudflare.com/ajax/libs/polyglot.js/2.2.2/polyglot.min.js"></script> HTML: <!DOCTYPE html> <html> <head> <title>مثال باستخدام Polyglot.js</title> </head> <body> <h1 id="greeting"></h1> <script src="https://cdnjs.cloudflare.com/ajax/libs/polyglot.js/2.2.2/polyglot.min.js"></script> <script> const phrases = { en: { "greeting": "Hello, world" }, ar: { "greeting": "مرحبًا بالعالم" } }; // يمكن تغيير 'en' إلى 'ar' للعربية const currentLanguage = 'en'; const polyglot = new Polyglot({ phrases: phrases[currentLanguage] }); function updateContent() { // تحديث النصوص في الصفحة باستخدام Polyglot.js document.getElementById('greeting').innerText = polyglot.t('greeting'); } // استدعاء الدالة للتحديث الأولي updateContent(); </script> </body> </html>
  18. تلك المشغلات أو المعاملات (== و =+) توجد في العديد من لغات البرمجة, وإليك قائمة ببعض اللغات التي تستخدم تلك المشغلات operators: معامل "==": Python Java C++ C# JavaScript Ruby PHP Swift Kotlin Rust وغيرها... معامل "=+": Python C++ C# JavaScript Ruby PHP Swift Kotlin Rust وغيرها... المشغل "==" يستخدم للمقارنة بين قيمتين للتحقق مما إذا كانت متساويتين أم لا، وفي حال كانت القيمتان متساويتين، فإن النتيجة تكون "صحيحة" أو "True"، وإلا فإن النتيجة تكون "خاطئة" أو "False"، ويستخدم في عمليات المقارنة في الشروط والتحكم في التدفق. مثال في لغة Python: x = 5 y = 10 if x == y: print("x is equal to y") else: print("x is not equal to y") والنتيجة هي "x is not equal to y" لأن قيمة x (5) ليست مساوية لقيمة y (10). ولكن انتبه في لغة مثل جافاسكريبت وPHP تحدث عملية تسمى Type coercion، أي تحويل القيمة إلى نوع آخر من أجل مقارنتها، أي عند مقارنة نص ورقم سيتم تحويل النص إلى رقم من أجل مقارنته كالتالي في جافاسكريبت: const x = 5; const y = "5"; console.log(x == y); سيتم طباعة True وهناك أمر هام آخر أيضًا يجب أن تنتبه إليه وهو أن هناك مشغل مشابه بالشكل التالي "===" موجود في بعض لغات البرمجة ويختلف عن مشغل "==" الذي ذكرته للمقارنة بين القيم. حيث أن "===" هو مشغل المقارنة الصارمة (Strict Equality Operator)، ويُستخدم للتحقق من تطابق القيمتين بالإضافة إلى نوع القيمتين، أي في حال كانت القيمتين متطابقتين من حيث القيمة والنوع، يعطي النتيجة "صحيحة" أو "True"، وإلا فإن النتيجة تكون "خاطئة" أو "False". مثلاً في JavaScript، المشغل "===" يُستخدم للمقارنة الصارمة. const x = 5; const y = "5"; console.log(x === y); // سيعطي "false" لأن x و y يحتويان على نفس القيمة (5) ولكن ليس نفس النوع. في PHP، المشغل "===" يستخدم أيضًا للمقارنة الصارمة. $x = 10; $y = "10"; var_dump($x === $y); // سيعطي "bool(false)" لأن $x و $y يحتويان على نفس القيمة (10) ولكن ليس نفس النوع. وفي لغة Python، لا يوجد مشغل "===" لأنها تختلف عن لغات أخرى مثل JavaScript و PHP التي تستخدم "===" للمقارنة الصارمة، لأن في Python، يستخدم مشغل "==" للمقارنة بين القيم فقط دون الاهتمام بنوع القيم. كالتالي: x = 5 y = "5" print(x == y) سيتم طباعة False أي لا يحدث Type coercion. أما بخصوص المشغل "=+" يستخدم لعملية إضافة قيمة إلى متغير موجود بدلاً من إعادة تعيينه بقيمة جديدة، أي أنك ترغب في إضافة قيمة إلى القيمة الحالية للمتغير. مثال في لغة C++: int x = 5; x += 3; // تعني x = x + 3 // الآن x ستكون تساوي 8 وهناك مشغلات أخرى مثل =! يستخدم للتحقق مما إذا كانت قيمتين غير متساويتين.
  19. عليك بتحميل برنامج WinRAR فهو برنامج أساسي لضغط وفك ضغط الملفات والمجلدات، وستجدي هنا رابط التحميل للنسخة العربية لإصدار ويندوز 32 و 64: 64 لغة عربية https://www.win-rar.com/fileadmin/winrar-versions/winrar-x64-622ar.exe 32 لغة عربية https://www.win-rar.com/fileadmin/winrar-versions/winrar-x32-622ar.exe وإليك روابط اللغة الإنجليزية: 64 لغة إنجليزية: https://www.win-rar.com/fileadmin/winrar-versions/winrar/winrar-x64-622.exe 32 لغة إنجليزية: https://www.win-rar.com/fileadmin/winrar-versions/winrar/winrar-x32-622.exe وبعد تثبيته تستطيعي ضغط المجلد كما أشار إليك عمر. وبالنسبة للتصميم الذي تريدينه، فمن الأفضل استخدام Flexbox من أجل تنفيذه، كالتالي: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>تنسيق الصور والنص بشكل مربع وبعرض 100%</title> <style> body { margin: 0; padding: 0; font-family: Arial, sans-serif; } .container { display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 10px; align-items: flex-start; padding: 20px; } .box { display: flex; align-items: center; width: 100vw; border: 2px solid #000; border-radius: 10px; overflow: hidden; } .box img { max-width: 200px; } .box p { padding: 10px; } </style> </head> <body> <div class="container"> <div class="box"> <img src="https://placehold.co/600x400/orange/white" alt="صورة 1"> <p>نص جهة اليمين 1</p> </div> <div class="box"> <img src="https://placehold.co/600x400/orange/white" alt="صورة 2"> <p>نص جهة اليمين 2</p> </div> <div class="box"> <img src="https://placehold.co/600x400/orange/white" alt="صورة 3"> <p>نص جهة اليمين 3</p> </div> <!-- يمكنك إضافة المزيد من الأزواج الصور والنصوص هنا --> </div> </body> </html> ولاحظي أنني استخدمت خاصية flex-wrap: wrap من أجل عرض الحاويات أسفل بعضها، فبدونه ستظهر بجانب بعضها وليس أسفل بعضها.
  20. عليك باستخدام مكتبة للتعامل مع الفيديو وتغيير جودته، مثل مكتبة "FFmpegMediaMetadataRetriever". وأولاً قم بإضافة مستودع "FFmpegMediaMetadataRetriever" إلى ملف gradle الخاص بتطبيقك: repositories { maven { url "https://github.com/wseemann/FFmpegMediaMetadataRetriever" } } ثم أضف تبعية المكتبة إلى نفس الملف gradle: dependencies { implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.19' } والآن، استخدم المكتبة لتحميل الفيديو وتغيير جودته إلى 360 بكسل وحفظه بشكل مستقل، ومن ثم استعراضه. import android.os.Bundle; import android.os.Environment; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import wseemann.media.FFmpegMediaMetadataRetriever; import java.io.File; public class VideoProcessingActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_processing); String originalVideoPath = "path/to/original_video.mp4"; String newVideoPath = Environment.getExternalStorageDirectory().getPath() + "/new_video.mp4"; int targetWidth = 360; // العرض المستهدف بالبكسل FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever(); try { retriever.setDataSource(originalVideoPath); String videoWidthStr = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); String videoHeightStr = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); int videoWidth = Integer.parseInt(videoWidthStr); int videoHeight = Integer.parseInt(videoHeightStr); if (videoWidth > targetWidth) { // حساب النسبة المئوية لتغيير الحجم float scaleRatio = (float) targetWidth / (float) videoWidth; int newHeight = Math.round(videoHeight * scaleRatio); // تغيير جودة الفيديو وحفظه retriever.release(); FFmpegMediaMetadataRetriever newRetriever = new FFmpegMediaMetadataRetriever(); newRetriever.setDataSource(originalVideoPath); File newFile = new File(newVideoPath); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_GENRE); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_TITLE); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_YEAR); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_MIMETYPE); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM_ARTIST); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DISC_NUMBER); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_NUM_TRACKS); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_WRITER); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_COMPILATION); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_HAS_AUDIO); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_HAS_VIDEO); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_HAS_IMAGE); newRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_HAS_BINARY); // إعداد نسبة تغيير الحجم newRetriever.setOption("vf", "scale=" + targetWidth + ":" + newHeight); newRetriever.setOption("override_ffmpeg_path", getApplicationInfo().dataDir + "/lib"); // حفظ الفيديو بالجودة المغيرة newRetriever.save(newFile.getAbsolutePath()); newRetriever.release(); // الآن يمكنك تشغيل الفيديو الجديد // يمكنك استخدام مكتبة مشغل الفيديو المفضل لديك // مثال: // VideoView videoView = findViewById(R.id.videoView); // videoView.setVideoPath(newVideoPath); // videoView.start(); } else { Toast.makeText(this, "جودة الفيديو أصغر من 360 بكسل", Toast.LENGTH_SHORT).show(); } } catch (NumberFormatException e) { e.printStackTrace(); Toast.makeText(this, "خطأ في تحميل الفيديو", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "حدث خطأ ما", Toast.LENGTH_SHORT).show(); } finally { retriever.release(); } } } وبالطبع التعديلات الأخيرة تم تنفيذها على فرض أن لديك الإذن المناسب للوصول إلى ذاكرة التخزين الخارجية (READ_EXTERNAL_STORAGE و WRITE_EXTERNAL_STORAGE)، ولا تنس تجهيز الإذن في ملف AndroidManifest.xml أيضًا.
  21. في البداية، الكود يقوم بإنشاء مثيل من MediaMetadataRetriever للحصول على الدقة (العرض) للفيديو. ولكنه لا يقوم بتحرير مصدر البيانات (data source) في المثيل الأول، بينما يقوم بذلك في المثيل الثاني. وذلك ليس منطقيًا وقد يؤدي إلى خطأ في تشغيل الفيديو. حاول إصلاح الجزء الأول من الكود ليصبح كالتالي: public void convert() throws IOException { String videoPath = "/sdcard/input.mp4"; // Get the video resolution MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(videoPath); // قم بتحديد مصدر البيانات للمثيل int videoResolution = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); retriever.release(); // قم بإطلاق المثيل بعد الانتهاء من الاستخدام // بقية الكود كما هو... } والجزء الذي يعيد حجم الصورة المصغرة (thumbnail) للفيديو ليس دقيقًا، ففي حالة إعادة تحجيم الصورة، من الأفضل استخدام طرق معينة للحفاظ على نسبة الأبعاد الصحيحة، وهناك أيضًا بعض الأخطاء في تسجيل الفيديو والصوت في الملتقط (muxer). ولحل تلك المشكلة وتحسين عملية تسجيل الفيديو والصوت، من الأفضل استخدام مكتبة مثل FFmpeg لتنفيذ تلك الوظائف بطريقة أكثر دقة وفاعلية، وتستطيع تضمين مكتبة FFmpeg في تطبيق Android الخاص بك واستخدامها لإجراء تحويلات وإعادة تحجيم الفيديو وتسجيله بأكثر دقة. ولاحظ أن استخدام FFmpeg يتطلب بعض الوقت والمجهود للتعامل مع الـ API الخاص بها، وفي حال كنت ترغب في الاستمرار باستخدام الأسلوب الحالي، فمن الأفضل التحقق من مثال كامل لتحويل وتغيير حجم الفيديو باستخدام MediaCodec وMediaMuxer وSurface وغيرها من الأدوات المتوفرة في Android SDK. وعامًة للحفاظ على نسبة الأبعاد الصحيحة عند إعادة تحجيم الصورة المصغرة، استخدم دالة Bitmap.createScaledBitmap() بطريقة تحسب الارتفاع الجديد بناءًا على النسبة بين العرض الجديد والعرض الأصلي: // Calculate the new dimensions while maintaining the aspect ratio int newWidth = 360; int newHeight = (int) (videoResolution * 1.0 / bmp.getWidth() * newWidth); // Resize the bitmap Bitmap resizedBmp = Bitmap.createScaledBitmap(bmp, newWidth, newHeight, true); ولتسجيل الفيديو والصوت بشكل صحيح، استخدم MediaCodec لتشفير الإطارات الفعلية من الفيديو والصوت ومن ثم تسجيلها باستخدام MediaMuxer. وتحتاج إلى استخدام MediaCodec للحصول على الإطارات (frames) من الفيديو وترميزها إلى تنسيق مثل H.264، ثم استخدام MediaMuxer لدمج البيانات المشفرة مع تنسيق صوتي مناسب (مثل AAC) لإنشاء ملف فيديو نهائي. وكما ذكرت هناك مكتبات جاهزة تساعدك في تحويل وتعديل الفيديو بشكل أسهل، مثل FFmpeg وغيرها.
  22. ستحتاجين إلى التوجه إلى الرابط التالي: https://accounts.hsoub.com/settings ثم إدخال رقم الهاتف في خانة رقم الجوال* مع إختيار الكود الخاص بالدولة، ولاحظي أنه في حالة مصر مثلاً الكود هو +20 وبالتالي نكتب رقم الهاتف بدون 0 في البداية. ثم اضغطي على حفظ التعديلات وسيظهر لك خيار تفعيل بجانب الرقم ومن المفترض أن يتم إرسال رقم تفعيل إلى هاتفك، وفي حال لم يصل حاول إضافة رقم هاتف لشبكة أخرى، وإليك شرح لطريقة التفعيل من قناة حسوب: وفي حال لم تتمكني من التفعيل تستطيعي مراسلة مركز المساعدة الخاص بموقع مستقل.
  23. المشاكل المعروفة هي كالآتي: فشل المعاملة لأسباب مختلفة ، مثل عدم وجود رصيد كافٍ في بطاقة الائتمان أو انتهاء صلاحية البطاقة أو إدخال بيانات غير صحيحة. استخدام بوابات الدفع لعمليات الاحتيال ، مثل سرقة بطاقات الائتمان أو استخدام بيانات بطاقة الائتمان المسروقة لإجراء عمليات شراء غير مصرح بها. اختراق بوابات الدفع ، مما يعرض بيانات بطاقات الائتمان للخطر. وعند إتمام عملية الدفع بنجاح، ستحصل عادة على استجابة (response) من بوابة الدفع، تتضمن: حالة الدفع: مثل "ناجح" أو "فشل". رقم المعاملة: وهو رقم مرجعي فريد للمعاملة. الرد من البنك: رسالة من بوابة الدفع أو البنك تحتوي على تفاصيل الدفع الناجح أو الفشل. رمز الاستجابة: يوحد رموز للردود تشير إلى نتيجة الدفع (مثل رمز 200 للنجاح). بعد الحصول على تلك البيانات، تستطيع تسجيل بعض المعلومات الأساسية في قاعدة البيانات للتفريق بين الدفعات الناجحة والفاشلة وتتبع حالة الطلبات، ومنها: رقم المعاملة. حالة الدفع (مثل "ناجح" أو "فشل"). المبلغ المدفوع. تاريخ ووقت الدفع. أخر 4 أرقام من البطاقة أو الحساب البنكي. معلومات المستخدم (اختياري، يعتمد على احتياجات موقعك). وإليك مثال للاستجابة من خلال بوابة دفع stripe: { "id": "ch_1234567890", "object": "charge", "created": 1582950736, "livemode": false, "currency": "usd", "amount": 1000, "description": "A test charge", "source": { "id": "src_1234567890", "object": "source", "type": "card", "last4": "1234", "exp_month": 12, "exp_year": 2023, "name": "John Doe", "address_line1": "123 Main Street", "address_line2": null, "city": "Anytown", "state": "CA", "country": "US", "zip": "91234", "cvc": "123" }, "destination": { "id": "cus_1234567890", "object": "customer" }, "status": "succeeded", "failure_message": null, "failure_code": null, "charge_back_id": null, "refunds": [ { "id": "re_1234567890", "object": "refund", "created": 1582950736, "amount": 1000, "currency": "usd", "reason": "customer_requested", "balance_transaction": "bal_1234567890" } ], "balance_transaction": { "id": "bal_1234567890", "object": "balance_transaction", "created": 1582950736, "amount": 1000, "currency": "usd", "description": "Charge succeeded", "type": "charge", "balance_delta": 1000, "available_on": 1582950736, "net_received": 1000, "fee": 0, "transfer_group": null }, "metadata": { "foo": "bar" } } وبالطبع تستطيع إجراء إختبارات على بوابة الدفع للتأكد من عملها بشكل سليم قبل نشر الموقع. وأيضًا لمعلوماتك علميات الاسترجاع للأموال يتم معالجتها من قبل بوابة الدفع.
  24. الذكاء الاصطناعي (AI) هو مجال من مجالات علوم الكمبيوتر يركز على إنشاء آلات ذكية، أي آلات قادرة على التفكير والتعلم والتصرف بشكل مستقل، وأحد أقوى أدوات الذكاء الاصطناعي هو التعلم الآلي (ML)، وهو فرع من الذكاء الاصطناعي يركز على تطوير الخوارزميات التي يمكنها تعلم من البيانات دون أن يتم برمجتها بشكل صريح. أحد أكثر أنواع التعلم الآلي شيوعًا هو التعلم الخاضع للإشراف، والذي يتضمن تدريب الخوارزمية على مجموعة بيانات من المدخلات والمخرجات، أي تدريب الخوارزمية على مجموعة بيانات من الصور والعلامات المقابلة لها، مثل "قطة" أو "كلب". بعد التدريب، يمكن استخدام الخوارزمية لتحديد الأنواع الموجودة في الصور الجديدة. وهناك نوع آخر من التعلم الآلي يسمى التعلم غير الخاضع للإشراف، والذي لا يتضمن مجموعة بيانات من العلامات. بدلاً من ذلك، يتم تدريب الخوارزمية على مجموعة بيانات من المدخلات فقط، مثل تدريب الخوارزمية على مجموعة بيانات من الصور، دون أن يتم تزويدها بالعلامات، وبعد التدريب، يمكن استخدام الخوارزمية لاكتشاف الأنماط في الصور، مثل مجموعات الألوان أو الأشكال. والذكاء الاصطناعي ليس مجرد كود. فقط بل هو مجال معقد يتضمن مجالات علمية وهندسية وفلسفية مختلفة، وكما أشرت التعلم الآلي هو أحد أقوى الأدوات التي تم تطويرها في مجال الذكاء الاصطناعي، وهو أداة لها القدرة على إحداث ثورة في العديد من الصناعات. وبخصوص الرياضيات ستجد هنا شرح مفصل لتلك النقطة:
  25. الذكاء الاصطناعي (AI) هو فرع من علوم الكمبيوتر يتعامل مع إنشاء الذكاء الاصطناعي، وهو قدرة الآلات على التعلم والتفكير والتصرف بشكل مستقل أي يتعامل مع إنشاء نماذج رياضية يمكنها التعلم من البيانات دون أن يتم برمجة ذلك بشكل صريح، أما أمن المعلومات هو مجال يتعامل مع حماية المعلومات من الوصول غير المصرح به أو الاستخدام أو التعديل أو الإفشاء أو التدمير. وبالطبع نستطيع استخدام الذكاء الاصطناعي لأغراض أمن المعلومات في العديد من المجالات، بما في ذلك: تحليل البيانات وتحديد الأنماط التي قد تشير إلى هجوم إلكتروني. تقييم المخاطر الأمنية وتحديد أفضل الطرق لتقليلها. تحسين البنية التحتية الأمنية من خلال أتمتة المهام وتحسين الرؤية. وبالتالي يؤدي تعلم مجال تعلم الآلة إلى تطوير مهارات الهاكرز الأخلاقيين، وفهم أفضل للتهديدات الأمنية وكيفية مواجهتها، كما يمكنهم استخدام تعلم الآلة لإنشاء أدوات وتقنيات جديدة يمكن استخدامها لأمن المعلومات. وبشكل مفصل إليك ما يمكن فعله، وأول الأمر تحليل نشاط المستخدمين: الهاكرز الأخلاقيين يقومون بإرسال رسائل احتيالية عبر البريد الإلكتروني لجميع الموظفين بهدف اختبار وعيهم وانتباههم، وتستخدم رسائل الاحتيال تلك بشكل شائع من قبل الهاكرز للحصول على معلومات حساسة أو الوصول غير المصرح به إلى نظام ما، وتتضمن رسالة الاحتيال وعودًا أو تهديدات لإغراء المستخدمين للنقر على رابط أو زيارة صفحة ويب، بعد ذلك، يتم تثبيت وتنفيذ برامج ضارة أو طلب معلومات سرية. ثم تحليل استجابات المستخدمين بعد حملة التوعية يتم دراستها، وتعديل السياسات والإجراءات حسب الحاجة، ويمكن للهاكرز الأخلاقيين تحديد خصائص المستخدمين الذين يحتمل أن يصبحوا ضحايا للتصيّد الاحتيالي، وبالتالي يمثلون مخاطر عالية للمنظمة باستخدام تعلم الآلة، على وجه الخصوص الأشجار القرارية. تحديد أنماط الهجمات الجديدة: تحتوي جميع أدوات إدارة شبكات الحواسيب حاليًا على آلية تسجيل، وتُعتبر ملفات السجل مصادر بيانات غنية تسجل وتعرض أنشطة المستخدمين ومحاولات الوصول إلى الشبكة ومشاكل النظام والتطبيقات وما إلى ذلك. عند حدوث هجوم ناجح واكتشافه في وقت لاحق، يتم تسجيل خصائصه، مثل المصدر والوقت ونوع الأجهزة وما إلى ذلك، في ملفات السجل، وبإمكان للهاكرز الأخلاقيين تحديد ومعالجة الثغرات الناجمة عن تلك الهجمات باستخدام تحليل تلك الهجمات باستخدام أشجار القرار، وهي نوع من تعلم الآلة. زيادة دقة الدفاع السيبراني: من المعروف أن أي دفاع سيبراني ليس مؤثرًا بشكل كامل، وسيكون هناك دائمًا حالات تصنف فيها الوصول الشرعي على أنه اختراق ويتم حظره؛ ما يعرف بالإيجابيات الكاذبة، وسيتم السماح للتسللات الحقيقية، أو ما يُعرف بالسلبيات الكاذبة. تتراكم تلك الحوادث مع مرور الوقت، ويوجد مكتبة منها في المنظمة، وبالتالي يُمكن بناء وتدريب نموذج Ai للتسلل باستخدام شبكات الأعصاب، وهي نوع من تعلم الآلةk بعد ذلك، ستحدد شبكة الأعصاب تلقائيًا ما إذا كان الوصول إلى الشبكة شرعيًا أم لا، مما يعزز الدقة العامة لأنشطة الهاكرز الأخلاقيين.
×
×
  • أضف...