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

Mustafa Suleiman

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

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

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

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

    445

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

  1. عليك بالتسويق في البداية في المجموعات المهتمة بذلك النوع من المنتجات على الفيسبوك، وأيضًا الـ Market Place الخاص به، وأيضًا حاول تكوين مجموعة على التيليجرام لتكوين قاعة عملاء وإغرائهم بخصم لكل من يشترك في المجموعة. أيضًا حاول إنشاء صفحة على الفيسبوك وكتابة محتوى مفيد والتسويق للمنتجات الخاصة بك، أو حاول كتابة محتوى مفيد في المجموعات المهتمة بذلك. بالإضافة إلى إنشاء مدونة على المتجر وكتابة محتوى مفيد حقًا يبحث عنه من يهتم بمنتجاتك ولا يجب أن يقل المحتوى عن 1000 كلمة وتكون مفيدة وليست حشو بدون داعي. وأرى أن المتجر الخاص بك باللغة الأجنبية، فهل أنت تستهدف دولة كندا؟ عليك بتفقد ما هي المنصات والبرامج التي يعتمد عليها عملائك ثم حاول تكوين قاعدة عملاء من خلالها كما أشرت إليك، والأمر بطيء بالطبع وبحاجة إلى وقت ونفس طويل.
  2. ما هو الخطأ الذي يظهر لك، يجب تحديد الخطأ لحل المشكلة، وربما لديك تعارض في إصدارات الحزم conflict peer dependencies ولحل المشكلة، عليك باستخدام مؤشر أو --legacy-peer-deps عند التثبيت أي كالتالي: npm i --legacy-peer-deps والسبب أنه بعض الأحيان، يكون من الصعب تثبيت حزم معينة بسبب تبعيات النظائر القديمة، وقد يحدث ذلك عندما تكون الحزمة الأصلية معتمدة على نسخة محددة من حزمة، ولكن نسخة أحدث من تلك الحزمة مثبتة بالفعل ويتعارض ذلك مع التبعية. ومن الأفضل استخدام الحزم المتوافقة مع بعضها، من خلال تحديث الحزم من خلال تشغيل حزمة npm-check-updates بالأمر التالي: npx npm-check-updates وسيتم تحديث إصدارات الحزم في ملف package.json والآن عليك بالتثبيت من خلال الأمر npm i. ولكن انتبه إلى أن تحديث الحزم إلى آخر إصدار قد يتعارض مع الكود الخاص بمشروعك في حال كانت الإصدارات الجديدة تتطلب تعديل على الكود.
  3. كل الدول جيدة للعمل في مجال البرمجة، أما إذا كان السؤال بخصوص الشركات ذات الراتب وبيئة العمل التي تراها على مواقع التواصل وخلافه، فستجد ذلك في الدول الأوروبية وأمريكا، وبالطبع دول الخليج ستجد رواتب مرتفعة لكن بيئة العمل ليست الأفضل لكن الأفضل في المنقطة العربية على الأقل. وعليك بتخصيص سؤالك لتحصل على إجابة أفضل، وأيضًا هناك بعض الدول التي بها صناعات في البرمجة مثل صناعة الألعاب لذلك هي أفضل من غيرها، وأيضًا هناك بعض الدول الأوروبية رواتبها منخفضة مقارنًة بدول أخرى وأمريكا الرواتب بها أعلى، لكن الدول الأوروبية أفضل في رأي.
  4. الخوارزمية الأساسية للعبة XO في الوقت الفعلي باستخدام React، Node.js، وSocket.IO ستكون كالتالي: يجب أن يتم التواصل بين العميل (Client) والخادم (Server) باستخدام تقنية الـ WebSockets التي توفر اتصالًا ثنائي الاتجاه حي بين العميل والخادم، وبالطبع تستطيع استخدام Socket.IO لتبسيط عملية التواصل عبر WebSockets. اتصال العميل بالخادم: عند تحميل صفحة اللعبة على المتصفح، ينشئ إتصال Socket.IO بين العميل والخادم. إبلاغ الخادم باللاعبين: عندما ينضم اللاعبين إلى اللعبة، ترسل بيانات معرف الجلسة (Session ID) إلى الخادم باستخدام Socket.IO لإعلام الخادم بوجود اللاعبين. بدء اللعبة: يجب أن يكون لديك آلية لبدء اللعبة عند انضمام لاعبين كافيين (مثلاً حد أدنى لعدد اللاعبين). إدارة الحركات: عندما يقوم أحد اللاعبين بعمل حركة (وضع "X" أو "O" على اللوح)، ترسال تلك الحركة إلى الخادم باستخدام Socket.IO. الخادم يتحقق من صحة الحركة ويتحقق مما إذا كانت الخانة محجوزة بالفعل أم لا. في حال كانت الحركة صحيحة، يتم تحديث اللوح بالحركة الجديدة وإعلام العميل الآخر بالحركة الجديدة. التحقق من الفوز: بعد كل حركة، يجب على الخادم التحقق من ما إذا كان هناك لاعب فاز باللعبة. في حالة الفوز، يتم إعلام اللاعبين بالنتيجة وإيقاف اللعبة. إدارة نهاية اللعبة: إذا انتهت اللعبة بسبب الفوز أو التعادل أو أي سبب آخر، يتم إغلاق الاتصال بين العميل والخادم.
  5. هناك طريقتان لتحميل الصور على 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)
  6. الأمر لا يمكن تخمينه بشكل جذافي هنا، بل عليك بتوكيل تلك المهمة إلى محاسب مختص بأمور الشركات أو محلل مالي مؤهل ومختص في التقييم المالي للشركات. فأنت ذكرت أن نسبتك هي 10% مما يعني أنه يوجد نسبة من الأرباح بقيمة 10% سنويًا ومن المفترض صرفها في حال مرور عام مالي. بعد ذلك يجب تصفية الشراكة ببيع نسبتك من الشركة وهي 10% ومن المفترض أن يتم تقييمها بناءًا على قيمة الشركة الحالية لا على القيمة التي دفعتها أنت. وهناك طريق آخر لكن لا أفضله، وهو الإتفاق على دفع مبلغ ترضاه أنت مقابل بيع حصتك بدون الأمور السابق ذكرها، أي مثلاً لو دفعت 100 ألف دولار، ورضيت بقيمة 300 ألف دولار مثلاً، فيتم بيع حصتك للطرف الآخر بناءًا على ذلك.
  7. ستحتاج أولاً إلى تعلم الأساسيات الخاصة بلغة برمجة تفضلها، وفي حال كان لديك الوقت الكافي والخبرة والاستيعاب فأنصحك بتعلم C++، وإذا واجهت صعوبة بعد المحاولة في تعلمها، فستجد بايثون الخيار الأمثل لك وهي الأسهل للمبتدئين الذين لا يمتلكوا أي خلفية عن علوم الحاسب والبرمجة، ولذلك تم شرح أساسيات في دورة علوم الحاسب. ولنفترض مثلاً أنك اخترت بايثون لتصبح لغة البرمجة الأولى لك، هنا لا تتسرع وتهرع إلى تعلم مهارة الـ Problem Solving بل عليك بالصبر والتعمق في لغة البرمجة الأولى لك ولا تحيد عنها، فكل ما تعلمته هي الأساسيات فقط. ويمكنك الاستزادة من خلال دراسة المسار الأول من دورة بايثون، وهو أساسيات لغة بايثون Python وهو متاح لك بشكل مجاني، وبالمثل المسار الأول من دورة جافاسكريبت أو حتى PHP وستجد شرح للأساسيات بشكل مفصل أكثر. ثم عليك بالبحث عن مشروع بايثون أو جافاسكريبت حتى للمبتدئين على اليوتيوب، ومتابعة الشرح ثم محاولة التطبيق بمفردك، وعليك بالتفكير في المشاكل التي تواجهك وكيفية حلها بالمعلومات المتوفرة لديك، وتقسيم المشكلة إلى أجزاء صغيرة ثم العمل عليها وهكذا، ولا تخف أبدًا من تعلم وتجربة أشياء جديدة فذلك هو المطلوب وذلك ما قصدته بالتعمق، وعليك بالبحث بعد التفكير فهو صديقك في رحلة تعلم البرمجة. وبعد الوصول إلى مستوى متوسط في لغة البرمجة الأولى لك، هنا تستطيع البدء في حل المشاكل والمسائل البرمجية على المواقع التي تم ذكرها لك ومنها codewars.com كما أشرت وأنا أفضله في البداية لكونه سهل الاستخدام وسهل للمبتدئين، وستجد على اليوتيوب شرح للمسائل الخاصة به أيضًا. وبتلك الخطوات ستتجنب الشعور بالإحباط بدون داعي، وستتمكن من تطوير مهاراتك البرمجية على أساس صحيح. وخصص لكل مسألة برمجية نصف ساعة إلى ساعة حسب صعوبة المسألة، ثم انظر للحل وتعلم منه وحاول الحل بمفردك، ثم انتقل للمسألة التالية، ولا تستغرق يوم كامل في حل مسألة مثلاً. وبالطبع عليك بالتدرج في حل المسائل من الأسهل للأصعب ولا تبدأ أبدًا بالمسائل الصعبة.
  8. يعتمد الرمز المستخدم لإعادة تشغيل جهاز التوجيه على نوع وموديل الجهاز، والرمز مختلف لكل جهاز، لذلك سأقدم لك نموذجًا عامًا يمكن أن يعمل على بعض الأجهزة، ولكن يجب عليك التأكد من أن الأمر يتوافق مع جهاز التوجيه الخاص بك. وقبل أن نستمر، يجب التأكد من أن جهاز التوجيه لديك يدعم إعادة التشغيل البعيدة عن طريق بروتوكولات مثل 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
  9. بالنسبة لقائمة التنقل 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
  10. لغة موجو 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، والبرمجة متعددة الاستخدامات.
  11. من الأسهل لك أن تعتمد على مكتبة جافاسكريبت لترجمة الموقع، وأشهرها مكتبة 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>
  12. تلك المشغلات أو المعاملات (== و =+) توجد في العديد من لغات البرمجة, وإليك قائمة ببعض اللغات التي تستخدم تلك المشغلات 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 وهناك مشغلات أخرى مثل =! يستخدم للتحقق مما إذا كانت قيمتين غير متساويتين.
  13. عليك بتحميل برنامج 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 من أجل عرض الحاويات أسفل بعضها، فبدونه ستظهر بجانب بعضها وليس أسفل بعضها.
  14. عليك باستخدام مكتبة للتعامل مع الفيديو وتغيير جودته، مثل مكتبة "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 أيضًا.
  15. في البداية، الكود يقوم بإنشاء مثيل من 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 وغيرها.
  16. ستحتاجين إلى التوجه إلى الرابط التالي: https://accounts.hsoub.com/settings ثم إدخال رقم الهاتف في خانة رقم الجوال* مع إختيار الكود الخاص بالدولة، ولاحظي أنه في حالة مصر مثلاً الكود هو +20 وبالتالي نكتب رقم الهاتف بدون 0 في البداية. ثم اضغطي على حفظ التعديلات وسيظهر لك خيار تفعيل بجانب الرقم ومن المفترض أن يتم إرسال رقم تفعيل إلى هاتفك، وفي حال لم يصل حاول إضافة رقم هاتف لشبكة أخرى، وإليك شرح لطريقة التفعيل من قناة حسوب: وفي حال لم تتمكني من التفعيل تستطيعي مراسلة مركز المساعدة الخاص بموقع مستقل.
  17. المشاكل المعروفة هي كالآتي: فشل المعاملة لأسباب مختلفة ، مثل عدم وجود رصيد كافٍ في بطاقة الائتمان أو انتهاء صلاحية البطاقة أو إدخال بيانات غير صحيحة. استخدام بوابات الدفع لعمليات الاحتيال ، مثل سرقة بطاقات الائتمان أو استخدام بيانات بطاقة الائتمان المسروقة لإجراء عمليات شراء غير مصرح بها. اختراق بوابات الدفع ، مما يعرض بيانات بطاقات الائتمان للخطر. وعند إتمام عملية الدفع بنجاح، ستحصل عادة على استجابة (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" } } وبالطبع تستطيع إجراء إختبارات على بوابة الدفع للتأكد من عملها بشكل سليم قبل نشر الموقع. وأيضًا لمعلوماتك علميات الاسترجاع للأموال يتم معالجتها من قبل بوابة الدفع.
  18. الذكاء الاصطناعي (AI) هو مجال من مجالات علوم الكمبيوتر يركز على إنشاء آلات ذكية، أي آلات قادرة على التفكير والتعلم والتصرف بشكل مستقل، وأحد أقوى أدوات الذكاء الاصطناعي هو التعلم الآلي (ML)، وهو فرع من الذكاء الاصطناعي يركز على تطوير الخوارزميات التي يمكنها تعلم من البيانات دون أن يتم برمجتها بشكل صريح. أحد أكثر أنواع التعلم الآلي شيوعًا هو التعلم الخاضع للإشراف، والذي يتضمن تدريب الخوارزمية على مجموعة بيانات من المدخلات والمخرجات، أي تدريب الخوارزمية على مجموعة بيانات من الصور والعلامات المقابلة لها، مثل "قطة" أو "كلب". بعد التدريب، يمكن استخدام الخوارزمية لتحديد الأنواع الموجودة في الصور الجديدة. وهناك نوع آخر من التعلم الآلي يسمى التعلم غير الخاضع للإشراف، والذي لا يتضمن مجموعة بيانات من العلامات. بدلاً من ذلك، يتم تدريب الخوارزمية على مجموعة بيانات من المدخلات فقط، مثل تدريب الخوارزمية على مجموعة بيانات من الصور، دون أن يتم تزويدها بالعلامات، وبعد التدريب، يمكن استخدام الخوارزمية لاكتشاف الأنماط في الصور، مثل مجموعات الألوان أو الأشكال. والذكاء الاصطناعي ليس مجرد كود. فقط بل هو مجال معقد يتضمن مجالات علمية وهندسية وفلسفية مختلفة، وكما أشرت التعلم الآلي هو أحد أقوى الأدوات التي تم تطويرها في مجال الذكاء الاصطناعي، وهو أداة لها القدرة على إحداث ثورة في العديد من الصناعات. وبخصوص الرياضيات ستجد هنا شرح مفصل لتلك النقطة:
  19. الذكاء الاصطناعي (AI) هو فرع من علوم الكمبيوتر يتعامل مع إنشاء الذكاء الاصطناعي، وهو قدرة الآلات على التعلم والتفكير والتصرف بشكل مستقل أي يتعامل مع إنشاء نماذج رياضية يمكنها التعلم من البيانات دون أن يتم برمجة ذلك بشكل صريح، أما أمن المعلومات هو مجال يتعامل مع حماية المعلومات من الوصول غير المصرح به أو الاستخدام أو التعديل أو الإفشاء أو التدمير. وبالطبع نستطيع استخدام الذكاء الاصطناعي لأغراض أمن المعلومات في العديد من المجالات، بما في ذلك: تحليل البيانات وتحديد الأنماط التي قد تشير إلى هجوم إلكتروني. تقييم المخاطر الأمنية وتحديد أفضل الطرق لتقليلها. تحسين البنية التحتية الأمنية من خلال أتمتة المهام وتحسين الرؤية. وبالتالي يؤدي تعلم مجال تعلم الآلة إلى تطوير مهارات الهاكرز الأخلاقيين، وفهم أفضل للتهديدات الأمنية وكيفية مواجهتها، كما يمكنهم استخدام تعلم الآلة لإنشاء أدوات وتقنيات جديدة يمكن استخدامها لأمن المعلومات. وبشكل مفصل إليك ما يمكن فعله، وأول الأمر تحليل نشاط المستخدمين: الهاكرز الأخلاقيين يقومون بإرسال رسائل احتيالية عبر البريد الإلكتروني لجميع الموظفين بهدف اختبار وعيهم وانتباههم، وتستخدم رسائل الاحتيال تلك بشكل شائع من قبل الهاكرز للحصول على معلومات حساسة أو الوصول غير المصرح به إلى نظام ما، وتتضمن رسالة الاحتيال وعودًا أو تهديدات لإغراء المستخدمين للنقر على رابط أو زيارة صفحة ويب، بعد ذلك، يتم تثبيت وتنفيذ برامج ضارة أو طلب معلومات سرية. ثم تحليل استجابات المستخدمين بعد حملة التوعية يتم دراستها، وتعديل السياسات والإجراءات حسب الحاجة، ويمكن للهاكرز الأخلاقيين تحديد خصائص المستخدمين الذين يحتمل أن يصبحوا ضحايا للتصيّد الاحتيالي، وبالتالي يمثلون مخاطر عالية للمنظمة باستخدام تعلم الآلة، على وجه الخصوص الأشجار القرارية. تحديد أنماط الهجمات الجديدة: تحتوي جميع أدوات إدارة شبكات الحواسيب حاليًا على آلية تسجيل، وتُعتبر ملفات السجل مصادر بيانات غنية تسجل وتعرض أنشطة المستخدمين ومحاولات الوصول إلى الشبكة ومشاكل النظام والتطبيقات وما إلى ذلك. عند حدوث هجوم ناجح واكتشافه في وقت لاحق، يتم تسجيل خصائصه، مثل المصدر والوقت ونوع الأجهزة وما إلى ذلك، في ملفات السجل، وبإمكان للهاكرز الأخلاقيين تحديد ومعالجة الثغرات الناجمة عن تلك الهجمات باستخدام تحليل تلك الهجمات باستخدام أشجار القرار، وهي نوع من تعلم الآلة. زيادة دقة الدفاع السيبراني: من المعروف أن أي دفاع سيبراني ليس مؤثرًا بشكل كامل، وسيكون هناك دائمًا حالات تصنف فيها الوصول الشرعي على أنه اختراق ويتم حظره؛ ما يعرف بالإيجابيات الكاذبة، وسيتم السماح للتسللات الحقيقية، أو ما يُعرف بالسلبيات الكاذبة. تتراكم تلك الحوادث مع مرور الوقت، ويوجد مكتبة منها في المنظمة، وبالتالي يُمكن بناء وتدريب نموذج Ai للتسلل باستخدام شبكات الأعصاب، وهي نوع من تعلم الآلةk بعد ذلك، ستحدد شبكة الأعصاب تلقائيًا ما إذا كان الوصول إلى الشبكة شرعيًا أم لا، مما يعزز الدقة العامة لأنشطة الهاكرز الأخلاقيين.
  20. عليك بالبحث أولاً واستخدم الكلمات الرئيسية المناسبة مثل "دورات تقوية للطب البشري"، "تحضير للدراسات الصحية"، "كورسات هندسة مجانية"، إلخ، ونفس الأمر باللغة الإنجليزية لتفقد المتاح على جوجل ويوتيوب. ولديك أيضًا Coursera وedX وهما يقدمان العديد من الدورات التعليمية في مجموعة متنوعة من التخصصات، بما في ذلك التخصصات الصحية والهندسية. يمكنك البحث عن المواضيع التي تهمك والاشتراك في الدورات المتوفرة من جامعات مرموقة حول العالم. أيضًا Udemy هي منصة تعليمية تقدم دورات عبر الإنترنت في مجموعة واسعة من الموضوعات، بما في ذلك العلوم والهندسة والطب. بالإضافة إلى Skillshare وهي منصة تعليمية تقدم دورات عبر الإنترنت في مجموعة واسعة من الموضوعات.
  21. بالطبع فهى تعتمد على الـ API's المتوفرة في المتصفح، فمثلا مكتبة react-media-recorder تعتمد على MediaRecorder API.
  22. من الأفضل استخدام إطار الإختبار PHPUnit المتاح للغة PHP، وستجد شرح هنا في الموقع الرسمي بناءًا على إصدار PHP الذي تستخدمه: https://phpunit.de/getting-started-with-phpunit.html مثلاً لإصدار PHP 8.1 واعلى سنقوم بتثبيت الإطار من خلال الأمر التالي: composer require --dev phpunit/phpunit ^10 ثم قم بإنشاء مجلد للاختبارات في مجلد مشروعك، وتسميته tests مثلاً، ثم داخل مجلد الاختبارات، أنشئ ملفًا جديدًا للاختبار، ويجب أن يكون اسم الملف ينتهي بـ Test.php، وليكن اسم الملف مثلاً ProductUploaderTest.php. ثم قم بتحديد الاعتمادات اللازمة في ملف الاختبار، بإضافة استيراد PHPUnit\Framework\TestCase واستيراد الكلاس الذي ترغب في اختباره، وفي حالتك، نحن نريد اختبار ProductUploader لذا يجب أن يكون الملف على النحو التالي: <?php // tests/ProductUploaderTest.php use PHPUnit\Framework\TestCase; // استيراد الكلاس الذي نرغب في اختباره include('ProductUploader.php'); class ProductUploaderTest extends TestCase { // هنا يمكنك إنشاء الاختبارات الخاصة بك } وعليك بإضافة دوال الاختبارات التي ترغب في إنشائها داخل الكلاس ProductUploaderTest، ويجب أن يبدأ اسم كل دالة اختبار بكلمة test، وليكن مثلاً إنشاء اختبار بسيط لدالة uploadProduct: <?php // tests/ProductUploaderTest.php use PHPUnit\Framework\TestCase; // استيراد الكلاس الذي نرغب في اختباره include('ProductUploader.php'); class ProductUploaderTest extends TestCase { // اختبار دالة uploadProduct public function testUploadProduct() { // الاستعداد للاختبار $dbMock = $this->createMock(mysqli::class); $dbMock->method('query')->willReturn(true); $uploader = new ProductUploader($dbMock); // القيام بالاختبار $result = $uploader->uploadProduct('Product Name', 'Product Description', 50, [ 'tmp_name' => '/path/to/temp/file', 'name' => 'product.jpg' ]); // التحقق من النتائج المتوقعة $this->assertTrue($result); } } وفي النهاية تشغيل الاختبارات باستخدام PHPUnit من سطر الأوامر، وعليك بالتأكد من وجود في مسار مجلد المشروع الرئيسي: ./vendor/bin/phpunit tests ولاحظ أن مجلد الإختبارات باسم tests. وستجد هنا توضيح مفصل: وأيضًا قد يفيدك على الإطلاع على Codeception بدلاً من PHPUnit:
  23. الأمر ممكن ولا مشكلة في ذلك، لكن في حال كنت مبتدأ في البرمجة فستحتاج إلى فترة 3 أشهر على الأقل، ودورة بايثون مكونة من 67 ساعة وبشكل منطقي ستحتاج إلى المزيد من الوقت للاستيعاب والمراجعة والبحث والتطبيق، أي على الأقل من 4 إلى 5 أضعاف وقت الدورة، لتصبح 67 *5 تساوي 335 ساعة وفي حال قمت بالدراسة بشكل يومي لدة 6 ساعات مثلاً فستحتاج إلى 55 يوم أي شهرين تقريبًا. وتلك فترة تقريبية، والأمر يعتمد على مدى استيعابك وخبراتك السابقة ومقدار الوقت المخصص يوميًا للدراسة والتطبيق، ولا تنسى التطبيق فهو أهم نقطة، ولا تكتفي بالمشاهدة السلبية والكتابة وراء المدرب فقط، بل عليك بتنفيذ ما تعلمته بمفردك مرة أخرى حيث ستقع في أخطاء وستفهم الأمر بشكل مختلف لكون تركيزك منصب على ما تفعله ،وأيضًا حاول التغيير في الكود لتفهم طبيعة عمله ولماذا استخدمنا ذلك وليس ذلك وهكذا.
  24. لإتخاذ قرارك بشكل سليم، هل تلك هي الخطوة الأولى في عالم البرمجة؟ أي لم تقم بكتابة أي كود من قبل ولا تعرف ما هي قاعدة البيانات ولا تعرف معنى API؟ هل تعرف معنى حلقة تكرار؟ أو جملة شرطية؟ هل قررت ما هو المجال الذي تنوي التخصص به في البرمجة، سواء ويب كمطور واجهاة أمامية أو Full-stack أو تطوير تطبيقات الهاتف أو مطور واجهة خلفية فقط باستخدام node.js أو PHP أو بايثون؟ إذا كانت الإجابة هي لا، فهنا أنت بحاجة إلى دراسة الأساسية والتعرف على مجال البرمجة بشكل عام أي معرفة عامة من الأعلى لترى الأمر بشكل واضح، ثم إختيار مجال للتخصص به بناءًا على وعي ودراية. وفي دورة علوم الحاسب ستتعلم التالي: أساسيات الحاسوب وعلومه والتفكير المنطقي وما هي الخوارزميات وكيف تفيد في البرمجة تطبيقات عملية على أساسيات التفكير المنطقي باستخدام بيئة سكراتش Scratch التفاعلية أساسيات لغة البرمجة JavaScript وتطبيق المفاهيم التي تم شرحها باستخدامها، والتوسع في شرح التطبيقات العملية للغات البرمجة، أيضًا أساسيا بايثون. أساسيات أنظمة التشغيل المختلفة وكيفية تثبيت البرمجيات اللازمة للبرمجة عليها أساسيات سطر الأوامر في نظام لينكس، وشرح الأسس التي بني عليها النظام مع تطبيقها عمليًا أنظمة قواعد البيانات المختلفة، مع شرح تفصيلي للغة SQL للتعامل معها مبادئ أساسية في أنظمة قواعد البيانات NoSQL المفاهيم الأساسية التي تبنى فيها صفحات الويب مفاهيم أساسية في الشبكات والخوادم، وكيف يتم استقبال الطلبيات إلى الخادم والرد عليها مبادئ الحماية والأمان في الويب وحاليًا يوجد عرض العطلة الصيفية، الذي يوفر لك الحصول على دورتين بسعر دورة واحدة. وبخصوص الدورة الأخرى أنصحك بالإطلاع على التالي:
  25. تسجيل شاشة الهاتف أثناء الاختبار هناك مكتبة تُدعى react-screen-recorder تستطيع الإعتماد عليها لتسجيل الشاشة أثناء الاختبار، وتلك المكتبة تعمل مع React وتُتيح للمستخدمين تسجيل شاشة هاتفهم أثناء استخدام التطبيق، ولتثبيتها استخدم الأمر التالي: npm install react-screen-recorder وستجد طريقة الاستخدام في المستودع الرسمي للمكتبة: https://github.com/DeltaCircuit/react-media-recorder وإليك مثال: import React, { useState } from 'react'; import { ScreenRecorder } from 'react-screen-recorder'; const ScreenRecorderComponent = () => { const [isRecording, setIsRecording] = useState(false); const handleRecording = (blob) => { // يمكنك إرسال الـ blob إلى المنصة الخاصة بك للمراجعة هنا console.log(blob); }; return ( <div> <h1>تسجيل شاشة الهاتف</h1> <ScreenRecorder onRecordingComplete={handleRecording} isRecording={isRecording}> {({ startRecording, stopRecording }) => ( <> {isRecording ? ( <button onClick={stopRecording}>إيقاف التسجيل</button> ) : ( <button onClick={startRecording}>بدء التسجيل</button> )} </> )} </ScreenRecorder> </div> ); }; export default ScreenRecorderComponent; ضع المكون في التطبيق وسيظهر زرًا يمكن للمستخدم النقر عليه لبدء تسجيل شاشة هاتفه، وبمجرد أن ينتهي المستخدم من تسجيل الشاشة، ستُستدعى وظيفة handleRecording وستُمرر لها blob الخاص بتسجيل الفيديو، هنا تستطيع إرسال الـ blob للواجهة الخلفية للمراجعة. تسجيل فيديو من الكاميرا الأمامية أثناء الاختبار وبالنسبة لتسجيل الفيديو من الكاميرا الأمامية، باستطاعتك استخدام تقنية التسجيل بواسطة MediaRecorder، والوصول إلى الكاميرا الأمامية باستخدام API "getUserMedia"، وهي API's متاحة من قبل المتصفح. وإليك مثال: async function startRecording() { const stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'user' }, audio: false }); const mediaRecorder = new MediaRecorder(stream); const chunks = []; mediaRecorder.ondataavailable = (e) => { if (e.data.size > 0) { chunks.push(e.data); } }; mediaRecorder.onstop = () => { const videoBlob = new Blob(chunks, { type: 'video/mp4' }); // قم بإرسال الـ videoBlob للمراجعة على المنصة الخاصة بك هنا }; mediaRecorder.start(); } function stopRecording() { mediaRecorder.stop(); } وعليك باستدعاء startRecording() عند بدء الاختبار و stopRecording() عند انتهائه. تحميل الفيديوهات للمراجعة وبمجرد انتهاء الاختبار، تستطيع إرسال الفيديوهات (شاشة الهاتف والكاميرا الأمامية) إلى المنصة الخاصة بك للمراجعة، باستخدام Node.js والمكتبات المناسبة لاستقبال الفيديوهات وتخزينها في الخادم أو قاعدة البيانات. وبالطبع نستخدم Express.js كإطار عمل لبناء نظام السيرفر واستقبال طلبات الفيديوهات، والإعتماد على مكتبات أخرى مثل Multer لتحميل الفيديوهات على الخادم. مثال: const express = require('express'); const multer = require('multer'); const app = express(); const upload = multer({ dest: 'uploads/' }); app.post('/upload', upload.single('video'), (req, res) => { // يتم تخزين الفيديو هنا في قاعدة البيانات أو أي مكان آخر تفضله console.log(req.file); res.send('تم تحميل الفيديو بنجاح!'); }); app.listen(3000, () => { console.log('السيرفر يعمل على منفذ 3000'); }); وبإمكانك استدعاء API نقطة النهاية /upload عند انتهاء الاختبار لتحميل الفيديوهات.
×
×
  • أضف...