Authorization

  • Angular 2: Secure Route Navigation

    في Angular 2، تتيح لك خاصية الـ Guards القدرة على تحكم دقيق في عملية توجيه المستخدمين إلى المسارات المناسبة بناءً على معايير معينة، مثل حالة تسجيل الدخول. واحدة من أنواع الـ Guards التي يمكن استخدامها هي الـ CanActivate، والتي تتيح لك فحص ما إذا كان بإمكان المستخدم الوصول إلى مسار معين أم لا.

    في حالتك، تريد منع المستخدمين المتصلين من الوصول إلى مسار معين (مثل “login” و “home”) بعد تسجيل الدخول، حيث يجب أن يتم توجيههم فورًا إلى صفحة أخرى إذا حاولوا الوصول إليها. لتحقيق هذا، يمكنك استخدام Guards المخصصة لكل مسار بشكل منفصل.

    لنبدأ بتحقيق هذا الهدف. يجب عليك أولاً إنشاء حارس (Guard) جديد يتحقق مما إذا كان المستخدم قد سجل الدخول أم لا. ثم، قم بتطبيق هذا الحارس على كل مسار يجب أن يكون متاحًا للمستخدمين المتصلين فقط. لنقم بتطبيق هذا في الكود:

    typescript
    import { Injectable } from '@angular/core'; import { CanActivate, Router } from '@angular/router'; import { AuthService } from './auth.service'; @Injectable() export class AuthGuard implements CanActivate { constructor(private authService: AuthService, private router: Router) {} canActivate(): boolean { if (this.authService.isLoggedIn()) { return true; } this.router.navigateByUrl('/login'); return false; } }

    في الكود أعلاه، تم إنشاء حارس جديد يُسمى “AuthGuard”. يتم تحقق فيه مما إذا كان المستخدم مسجل الدخول باستخدام خدمة الـ AuthService. إذا كان المستخدم مسجل الدخول، يتم السماح له بالوصول، أما إذا لم يكن مسجل الدخول، فسيتم توجيهه إلى صفحة تسجيل الدخول.

    الآن، يمكنك استخدام هذا الحارس في تكوين الطرق في التطبيق. تأكد من تطبيقه على الطرق التي تريد حمايتها. لتحقيق ذلك، يمكنك تحديد الحارس كـ CanActivate في تكوين الطرق كما يلي:

    typescript
    import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home.component'; import { DashboardComponent } from './dashboard.component'; import { LoginComponent } from './login.component'; import { AboutComponent } from './about.component'; import { AuthGuard } from './auth.guard'; const routes: Routes = [ { path: '', component: HomeComponent }, { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] }, { path: 'login', component: LoginComponent }, { path: 'about', component: AboutComponent }, { path: '**', redirectTo: '' } // يُعالج الطرق التي لا تتطابق مع أي مسار آخر ]; export const routing = RouterModule.forRoot(routes);

    في الكود أعلاه، تم تطبيق الحارس “AuthGuard” على المسار “dashboard” باستخدام الخاصية “canActivate”. هذا يعني أنه فقط المستخدمون المسجلون يمكنهم الوصول إلى هذا المسار. بينما يمكن لغير المستخدمين الوصول إلى المسارات الأخرى مثل “login” و “home” و “about”.

    بهذا، يمكنك الآن تحقيق المطلوب، حيث سيتم توجيه المستخدمين غير المسجلين تلقائيًا إلى صفحة تسجيل الدخول، ولكنهم سيتمكنون من الوصول إلى المسارات الأخرى المتاحة مثل “home” و “about”.

    المزيد من المعلومات

    بالطبع، هناك بعض المعلومات الإضافية التي يمكن توفيرها لتعميق فهمك لكيفية تنفيذ هذه الوظيفة بشكل أفضل:

    1. خدمة المصادقة (AuthService): في الكود السابق، تم استخدام خدمة الـ AuthService لفحص ما إذا كان المستخدم قد سجل الدخول أم لا. يمكن أن تكون هذه الخدمة مسؤولة عن تخزين معلومات تسجيل الدخول الخاصة بالمستخدم، مثل الجلسة أو الرمز المميز (token)، وتوفير وظائف لتسجيل الدخول وتسجيل الخروج.

    2. التوجيه (Routing): في Angular، يتم استخدام التوجيه لتحديد كيفية توجيه المستخدمين إلى مكونات الواجهة الخاصة بالتطبيق على أساس الرابط الذي يطلبونه. في الكود السابق، تم تعريف مجموعة من الطرق (routes) التي تحدد كيفية التوجيه بين المكونات المختلفة، وتم استخدام Guards لتحديد من يمكن الوصول إلى كل مسار.

    3. حارس (Guard): هو جزء من نظام التوجيه في Angular ويسمح بفحص ما إذا كان المستخدم مؤهلاً للوصول إلى مسار معين أم لا. في الكود السابق، تم استخدام حارس (AuthGuard) لتحقق من حالة تسجيل الدخول للمستخدم. يمكن أيضًا استخدام حواسب لتطبيق قواعد أمان أخرى مثل التحقق من الصلاحيات.

    4. تسجيل الخروج (Logout): يجب أيضًا توفير وظيفة لتسجيل الخروج للمستخدمين بعد انتهاء جلسة العمل. يمكن أن تقوم خدمة الـ AuthService بتنفيذ هذه الوظيفة من خلال مسح المعلومات ذات الصلة مثل الجلسة أو الرمز المميز.

    5. حماية البيانات الحساسة: في التطبيقات التي تتضمن معلومات حساسة، مثل بيانات المستخدم أو المعلومات المالية، يجب زيادة مستويات الأمان وتطبيق إجراءات حماية إضافية مثل التشفير والتوثيق المزدوج.

    6. إدارة الجلسات (Session Management): تعتبر إدارة الجلسات جزءًا مهمًا من تطبيقات الويب التي تتضمن تسجيل الدخول، ويجب تنفيذها بعناية لضمان أمان المستخدم وحماية بياناته الشخصية.

    7. استخدام نسخ Angular الأحدث: يُفضل استخدام أحدث إصدارات Angular حيث قد يتم تحسين وتوسيع ميزات الأمان والأداء، بالإضافة إلى دعم أحدث التقنيات والميزات.

    من خلال فهم هذه المعلومات الإضافية، يمكنك تطوير تطبيق Angular الخاص بك بطريقة توفر أمانًا وحماية أفضل للمستخدمين وبياناتهم.

  • تطبيق Websockets في Symfony

    Using Websockets for Real-Time Communication in a Symfony Project

    In a PHP Symfony project, you can implement real-time communication between the server and browsers using Websockets. Websockets allow for full-duplex communication channels over a single TCP connection, enabling real-time data transfer.

    Steps to Implement Websockets in Symfony

    1. Install Ratchet: Ratchet is a PHP library that provides Websocket server and client implementations. You can install it using Composer:

      bash
      composer require cboden/ratchet
    2. Create a Websocket Server: You need to create a Websocket server to handle incoming connections and manage communication between the server and clients. Here’s a basic example of a Websocket server in Symfony:

      php
      // src/Command/WebsocketServerCommand.php namespace App\Command; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use App\WebSocket\Chat; class WebsocketServerCommand extends Command { protected static $defaultName = 'websocket:start'; protected function execute(InputInterface $input, OutputInterface $output) { $server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080 ); $output->writeln('Websocket server started.'); $server->run(); return Command::SUCCESS; } }
    3. Create a Websocket Handler: You also need to create a handler to manage incoming Websocket connections and messages. This handler can be used to send notifications to connected clients:

      php
      // src/WebSocket/Chat.php namespace App\WebSocket; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "New connection! ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Connection {$conn->resourceId} has disconnected\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "An error has occurred: {$e->getMessage()}\n"; $conn->close(); } }
    4. Start the Websocket Server: You can start the Websocket server using the Symfony console command:

      bash
      php bin/console websocket:start
    5. Client-Side Integration: On the client side, you can use JavaScript to connect to the Websocket server and receive notifications. Here’s a basic example using the WebSocket API:

      javascript
      var socket = new WebSocket('ws://localhost:8080'); socket.onopen = function() { console.log('Connected to websocket server'); }; socket.onmessage = function(event) { console.log('Received message:', event.data); // Handle notification logic here };

    Conclusion

    Implementing Websockets in a Symfony project allows you to create real-time communication channels between the server and clients, enabling features like live notifications. By following the steps outlined above, you can integrate Websockets into your Symfony application and enhance its real-time capabilities.

    المزيد من المعلومات

    بالتأكيد! إضافة إلى ما تم ذكره، هناك بعض النقاط التي يجب مراعاتها عند استخدام Websockets في مشروع Symfony:

    1. Integration with Symfony Services

    • يمكنك تضمين خدمات Symfony في معالج Websocket للوصول إلى قاعدة البيانات أو القيام بمهام أخرى.
    • يمكنك حقن الخدمات في معالج Websocket من خلال تضمينها في الكونتينر المخصص للخدمة.

    2. Authentication and Authorization

    • يجب تأمين الاتصالات بين الخادم والعملاء باستخدام آليات المصادقة والترخيص المناسبة.
    • يمكنك استخدام خدمات Symfony لإدارة عمليات المصادقة والترخيص.

    3. Scalability and Performance

    • يجب مراعاة تحمل الأداء وتوسيع النظام عند تطوير تطبيق يستخدم Websockets.
    • يمكنك استخدام خدمات الاحتياطي والتحميل التلقائي المتاحة في Symfony لتحقيق هذا الهدف.

    4. Handling Disconnections and Errors

    • يجب التعامل بشكل صحيح مع فقدان الاتصال والأخطاء في Websockets لضمان استمرارية التطبيق.
    • يمكنك استخدام حساسات الأخطاء والأحداث في معالج Websocket لمعالجة هذه الحالات.

    5. Testing

    • يجب اختبار تطبيقك بشكل كامل لضمان أن الاتصال بين الخادم والعملاء يعمل بشكل صحيح.
    • يمكنك استخدام أدوات اختبار الوحدات والاختبارات الوظيفية في Symfony لهذا الغرض.

    ملخص

    استخدام Websockets في مشروع Symfony يتطلب توجيه العناية لعدة جوانب مثل التكامل مع خدمات Symfony، وتأمين الاتصالات، وتحمل الأداء، والتعامل مع الأخطاء. باستخدام Symfony بشكل صحيح، يمكنك تطوير تطبيقات فعالة وموثوقة تستفيد من فوائد التواصل في الوقت الحقيقي.

  • Unleashing the Potential: Google Maps Your Timeline API

    Google Maps Your Timeline API: Unlocking the Power of Location History

    Google Maps has introduced a powerful and intriguing feature called “Your Timeline” (الخط الزمني الخاص بك), accessible at https://www.google.com/maps/timeline. This innovative tool allows users to access and retrieve their location history, offering a comprehensive overview of their past movements. For those new to the Google ecosystem, leveraging this feature might seem like a daunting task. In this article, we will explore how to utilize the Google Maps Your Timeline API to tap into the wealth of information stored in your location history.

    Navigating the Google Maps Your Timeline Interface

    Before delving into the technicalities of the API, let’s take a moment to familiarize ourselves with the Your Timeline interface. Accessible through the provided link, this feature showcases a chronological record of your past locations, complete with dates, times, and even the means of transportation used. It serves as a personalized digital diary of your journeys, offering a glimpse into the places you’ve been and the routes you’ve taken.

    Unveiling the Your Timeline API

    Now, the central question remains: How can one programmatically access and retrieve data from Your Timeline? The good news is that Google provides developers with a set of APIs that allow seamless integration with this feature. By using the Google Maps Your Timeline API, developers can harness the power of location history data for various applications and services.

    Getting Started: Authentication and Authorization

    To begin the journey of accessing Your Timeline data programmatically, developers need to set up authentication and obtain the necessary authorization. Google Maps APIs typically require an API key or OAuth 2.0 credentials for secure communication between the application and Google’s servers. Once authenticated, developers can initiate requests to retrieve the user’s location history.

    Making Requests and Handling Responses

    The Google Maps Your Timeline API supports HTTP requests to fetch location history data. Developers can specify parameters such as start and end dates, location granularity, and additional filtering options to tailor the results according to their needs. The API responds with a structured dataset containing detailed information about the user’s movements during the specified time frame.

    Incorporating Your Timeline Data into Applications

    The real value of the Your Timeline API emerges when developers integrate this location history data into their applications. Whether creating travel journals, analyzing commuting patterns, or building location-aware services, the possibilities are vast. The retrieved data includes not only geographic coordinates but also contextual information like place names, addresses, and transit details.

    Challenges and Considerations

    While the Your Timeline API opens up exciting possibilities, developers should be mindful of privacy concerns. Accessing location history is a sensitive matter, and user consent is paramount. It’s crucial to implement robust security measures and adhere to Google’s API usage policies to ensure a responsible and ethical use of the provided data.

    Conclusion

    In conclusion, Google Maps Your Timeline API empowers developers to unlock the wealth of location history data stored in users’ accounts. By navigating through the authentication process, making well-crafted requests, and responsibly incorporating the data into applications, developers can create innovative solutions that leverage the power of location intelligence. As you embark on your exploration of the Your Timeline API, remember to embrace the exciting possibilities it offers while prioritizing user privacy and data security. Happy coding!

    المزيد من المعلومات

    Beyond the technical aspects of using the Google Maps Your Timeline API, let’s delve into additional information that can enhance your understanding and utilization of this powerful tool.

    Use Cases and Applications

    1. Travel Analytics: The Your Timeline API opens up opportunities for travel analytics applications. Developers can analyze user movement patterns, popular destinations, and even provide personalized travel recommendations based on historical data.

    2. Geofencing and Notifications: Utilizing the location history data, developers can implement geofencing solutions. This enables the creation of virtual boundaries, triggering notifications or actions when a user enters or exits a specific geographical area.

    3. Fitness and Health Tracking: For fitness apps, incorporating Your Timeline data can enhance the tracking of outdoor activities. Whether it’s jogging routes, cycling paths, or hiking trails, the API provides valuable information for health and fitness applications.

    4. Expense Tracking for Business Travel: Professionals on business trips can benefit from expense tracking applications that leverage location history. Automated expense reports can be generated by associating locations with business-related transactions.

    5. Local Recommendations: By understanding a user’s historical preferences and favorite spots, developers can create applications that offer tailored local recommendations, from restaurants to entertainment venues.

    Limitations and Considerations

    1. Data Accuracy and Battery Consumption: While the Your Timeline feature is powerful, its accuracy depends on various factors such as GPS signal strength and device capabilities. Users should be aware that constant location tracking can impact battery life.

    2. User Consent and Privacy Compliance: Developers must prioritize user consent and adhere to privacy regulations when implementing applications that access location history. Transparent communication about data usage is essential to build trust with users.

    3. Rate Limits and Quotas: Google imposes usage limits on its APIs to prevent abuse. Developers should be aware of these limits and design their applications to handle potential rate-limiting scenarios gracefully.

    4. Offline Access: Applications utilizing Your Timeline data should consider scenarios where users may not have a consistent internet connection. Implementing offline access or caching mechanisms can enhance the user experience.

    Future Developments

    Google is known for continuously enhancing its services, and the Your Timeline feature is no exception. Developers should keep an eye on Google’s developer documentation and announcements for any updates, new features, or improvements to the Your Timeline API.

    Community and Resources

    Joining the Google Maps developer community and forums can be invaluable. Engaging with other developers, sharing experiences, and seeking guidance can expedite the learning process and help overcome any challenges encountered while working with the Your Timeline API.

    In conclusion, the Google Maps Your Timeline API is a dynamic tool with extensive possibilities. By exploring diverse use cases, understanding limitations, and staying connected with the developer community, you can unlock the full potential of this feature for innovative and impactful applications.

  • استخدام Postman للتفاعل مع واجهة API في Toggl

    في محاولتك للاتصال بواجهة برمجة التطبيقات (API) الخاصة بـ Toggl لمشروعك، وجدت نفسك مواجهًا لتحدي في استخدام C# wrapper، مما دفعك إلى تجربة إرسال طلب HTTP بسيط باستخدام Postman. يبدو أن المشكلة تكمن في استخدام رمز API Token الخاص بك في الطلب. الدليل الذي وفرته Toggl يستخدم أمر CURL مع الخيار “-u” لتحديد اسم المستخدم وكلمة المرور.

    لتحقيق نفس الفعالية في Postman، يمكنك تضمين رمز API Token في رأس الطلب باستخدام تسمية “Authorization” مع قيمة “Bearer [API Token]”. لنقم بتفكيك الأمر CURL وتحويله إلى طلب HTTP صحيح باستخدام Postman.

    في الأصل، الأمر CURL هو:

    bash
    curl -u my-secret-toggl-api-token:api_token -X GET "https://www.toggl.com/reports/api/v2/project/?page=1&[email protected]&workspace_id=1&project_id=2"

    والترجمة إلى طلب HTTP يكون كالتالي:

    باستخدام هذا الطلب، يمكنك تجربة الاتصال بـ Toggl API باستخدام رمز API Token الخاص بك. يُفضل أن تتأكد من استبدال “my-secret-toggl-api-token:api_token” بالرمز الفعلي الذي تحمله.

    إذا كنت تواجه مشكلة محددة، يفضل التحقق من الوثائق الخاصة بـ Toggl API أو التواصل مع دعم المطورين للحصول على مساعدة إضافية.

    المزيد من المعلومات

    في سعيك للتواصل مع واجهة برمجة التطبيقات (API) الخاصة بـ Toggl من أجل مشروعك، واجهت تحديات في استخدام C# wrapper، مما دفعك إلى استخدام Postman لإرسال طلب HTTP بسيط لإجراء تجربة. يظهر أن المشكلة تتعلق بكيفية تضمين رمز API Token الخاص بك في الطلب.

    أمر CURL الذي قدمته Toggl هو:

    bash
    curl -u my-secret-toggl-api-token:api_token -X GET "https://www.toggl.com/reports/api/v2/project/?page=1&[email protected]&workspace_id=1&project_id=2"

    وقد قمت بمحاولة تحويله إلى طلب HTTP صحيح باستخدام Postman. يمكنك استخدام Postman لإرسال الطلب مع رمز API Token.

    للقيام بذلك، قمت بتضمين الرمز في رأس الطلب باستخدام مفتاح “Authorization” وقيمة “Bearer [API Token]”. الطلب يبدو كما يلي:

    من خلال هذا الطلب، يمكنك إجراء اتصال بـ Toggl API باستخدام رمز API Token الخاص بك. تأكد من استبدال “my-secret-toggl-api-token:api_token” بالرمز الحقيقي الخاص بك.

    إذا واجهت أي تحديات أو مشاكل، يفضل مراجعة وثائق Toggl API للحصول على تفاصيل إضافية أو الاتصال بفريق دعم المطورين للمساعدة.

  • استكشاف عمق Node.js: بناء تطبيقات قوية وفعّالة

    في رحلتك نحو فهم عميق للتطوير باستخدام Node.js، يجب أن تدرك أن Node.js هو بيئة تشغيل JavaScript على الخادم، تمكنك من بناء تطبيقات قائمة على الشبكة بطريقة فعّالة وقابلة للتوسع. يشكل هذا الدليل خطوة هامة نحو فهم شامل وعميق لهذه التقنية الرائعة.

    يبدأ الطريق نحو فهم Node.js بفهم أساسياته. يمكنك البدء بتثبيت Node.js و NPM (مدير حزم النود) على جهاز الكمبيوتر الخاص بك. بعد ذلك، يجب عليك التعرف على كيفية كتابة برنامج بسيط باستخدام Node.js. ابدأ بفهم الطريقة التي يدير بها Node.js الأحداث وكيف يتم التعامل مع الإدخال/الإخراج.

    بمجرد أن تتقن أساسيات Node.js، يمكنك التحرك إلى الأمور الأعمق. فهم كيفية استخدام NPM لإدارة الحزم والوابثات (Modules) لتسهيل عملية بناء تطبيقاتك. يوفر النظام الشهير Express.js إطار عمل فعّال يسهل بناء تطبيقات ويب قائمة على Node.js.

    يجب عليك أيضًا النظر في كيفية التعامل مع قواعد البيانات باستخدام Node.js. يمكنك اختيار ملاءمة بين قواعد البيانات العامة مثل MongoDB أو MySQL والتفاعل معها باستخدام ORM (Object-Relational Mapping) مثل Mongoose.

    للمزيد من التعمق، يمكنك استكشاف مفهوم الميكروسيرفيسز وكيف يمكنك بناء تطبيقات موزعة قائمة على Node.js. استكشاف كيفية استخدام WebSocket لتحسين تفاعل التطبيقات في الوقت الحقيقي أيضاً يمكن أن يكون له فائدة كبيرة.

    لا تنسَ الاستفادة من مصادر التعلم عبر الإنترنت مثل وثائق Node.js الرسمية، ودورات الفيديو على منصات مثل Udemy و Coursera. تجربة البرمجة الفعلية وبناء تطبيقات صغيرة ثم توسيعها تدريجياً ستكون أيضًا طريقة فعّالة لتحسين مهاراتك.

    في الختام، يعتبر فهم Node.js تحديًا شيقًا ومثيرًا، ولكن باستمرارية التعلم والتجربة، ستجد نفسك قادرًا على بناء تطبيقات قوية وفعّالة باستخدام هذه التقنية المثيرة.

    المزيد من المعلومات

    بالطبع، دعونا نتناول المزيد من المعلومات لتعزيز فهمك حول Node.js وتطبيقاته في عالم تطوير البرمجيات.

    عندما تصل إلى مرحلة متقدمة من تعلم Node.js، يمكنك استكشاف مفاهيم مثل “Middleware”، الذي يسمح لك بتنظيم طريقة معالجة الطلبات والاستجابات في تطبيقك. Middleware يمكن أن يكون له أدوار متنوعة، من تحقق الهوية والتأكد من الصلاحيات إلى تسجيل الطلبات والاستجابات.

    تطوير تطبيقات الويب في عالم اليوم يشمل أيضاً مفهوم الـ”Authentication” والـ”Authorization”. يمكنك استخدام استراتيجيات مثل JWT (JSON Web Tokens) لتأمين تطبيقك والتحقق من هوية المستخدمين.

    يمكنك أيضًا التعمق في فهم مفهوم “Testing”، حيث يصبح اختبار تطبيقات Node.js جزءًا هامًا من عملية التطوير. تعلم كيفية كتابة وحدات الاختبار (Unit Tests) واختبار الأداء يمكن أن يساعد في تحسين جودة التطبيقات الخاصة بك.

    مع تطور التكنولوجيا، يصبح التعامل مع الـ”Real-Time Applications” ذا أهمية خاصة. يُمكنك استخدام تقنيات مثل Socket.io لتحقيق الاتصال الحي في الوقت الحقيقي بين الخادم والعميل، مما يتيح لتطبيقك تفاعلًا أسرع وأكثر ديناميكية.

    لا تنسَ أيضًا النظر في مفاهيم التحسين والأمان. يمكنك استخدام أساليب مثل “Caching” لتحسين أداء التطبيق، وتطبيق إجراءات الأمان لحماية التطبيق من التهديدات الأمنية.

    إلى جانب ذلك، استكشاف تقنيات الـ”Serverless Computing” وكيف يمكنك استخدام خدمات مثل AWS Lambda أو Azure Functions لتشغيل الكود بدون الحاجة إلى إدارة البنية التحتية للخادم.

    في الختام، Node.js هو تكنولوجيا متعددة الأوجه تفتح لك أبوابًا لبناء تطبيقات متقدمة وفعّالة. استمر في التعلم والتجربة، وستكتسب المهارات التي تحتاجها لتطوير تطبيقات ذكية ومبتكرة باستخدام هذه البيئة الرائعة.

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر