العودة   منتديات طلاب الجامعة العربية المفتوحة > منتدى كليات الجامعة العربية المفتوحة > منتدى تقنية المعلومات والحاسوب > M255

إضافة رد
 
أدوات الموضوع انواع عرض الموضوع

قديم 01-01-2010, 02:13 AM   #1
ali4ali ali4ali غير متصل
طــالب
 
الصورة الرمزية ali4ali

 











افتراضي - m255 - شرح و ملخص يونت 12 بالعربي ان شاء الله





بارك الله فيك ..
s.a.r.a

**********


بسم الله الرحمن الرحيم

:: و اصلي و اسلم على سيد المرسلين محمـــد و اله الطاهرين ::

موضوع الوحدة : Streams, files and persistent objects

يونت 12 بكل بساطة اهم وحدة بالنسبة لمن يريد التعمق و الاستمرار في تعلم جافا . لماذا ؟
لانها تُعني بالكتابة و القراءة من الملفات الخارجية بالاضافة الى الاستمرارية ( اي حفظ حالة البرنامج بحفظ الاوبجكتس ). تصور ان تنشيء برنامج لتحرير النصوص و لكن كلما تغلق البرنامج يجب ان تعيد كتابة الموضوع فلا يمكنك المواصلة من حيث ما انتهيت ! و تخيل ايضا انك قمت ببرمجة لعبة و لكن مستخدميك لا يستطيعون حفظ اللعبة في مرحلة ما ! سيكون من المحبط جدا ان يبدؤا اللعب من جديد ليصلوا الى المرحلة التي وصلوا اليها !..

جافا تقدم طرق كثيرة جدا ( كلاسات) لهذه الاغراض مثل الكتابة الى ملفات نصية او ملفات XML او قاعدة بيانات سواء مايسكوال او اوراكل او غيرها و ايضا هناك طريقة اسمها Serialization ...الخ
في هذا الكورس سنستخدم فقط الكتابة الى الملفات النصية باستخدام بعض الكلاسات التي سنتكلم عنها لاحقا و السيرياليزشن ..

الان و قد عرفنا اهمية هذه الوحدة لنتطرق الى اهم المصطلحات :
Buffer
مكان مؤقت لحفظ المعلومات اثناء انتقالها من المصدر الى المخزن
File
اي اوبجكت من هذا الكلاس يحوي العنوان الى ملف او مجلد بصيغة مستقلة عن نظام التشغيل . و لا
يعني بالضرورة ان العنوان يشير الى ملف موجود بل ربما ملف سيتم انشاؤه لاحقا.
InputStream
كلاس رئيسي يحوي عدة كلاسات منها FileInputStream و غيره و التي تستخدم لقراءة ستريم من نوع 8 بت اي بناري.
OutputStream
كلاس رئيسي يحوي عدة كلاسات منها FileOutputStreamو التي تستخدم لكتابة ستريمز من نوع 8 بت اي بناري.

Persistence
الاستمرارية او قدرة الاوبجكتس على البقاء بعد انهاء البرنامج
Reader
كلاس رئيسي يحوي عدة كلاسات منها FileReader و التي تستخدم لقراءة ستريمز من نوع 16 بت و تستخدم هذه الكلاسات لقراءة الملفات النصية
Writer
و هو كلاس رئيسي يحوي عدة كلاسات منها فايل رايتر
و التي تستخدم لكتابة ستريمز من نوع 16 بت . تستخدم هذه الكلاسات في الكتابة الى الملفات النصية
Stream
هو عبارة عن اوبجكت يستخدم للتوصيل بين المصدر و المخزن مما يتيح امكانية نقل البيانات بين المصدر و المخزن
Serialisation
هي العملية التي تمكن من كتابة اي اوبجكت يطبق واجهة serializable الى ObjectOutStream
على شكل سلسة من البايتس (لا يمكن للبشر قراءتها) .
Scanner
هو كلاس يستخدم لقراءة الرموز النصية من مصدر ما


لا تقلقوا ابدا ان كان صعب عليكم فهم هذه المصطلحات ستعرفونها من خلال الشرح اكثر..

1- الملفات و الستريمز :
بداية احب ان اشير ان كل ما سنستخدمه في هذه الوحدة يحتاج الى هذه المكتبة فلا تنسوا ان تضعوها في راس برامجكم :
كود PHP:
import java.io.*; 
كما قلنا سابقا الستريم هو عبارة عن اوبجكت يصل بين المصدر و بين المخزن يمكن ان نتصوره كنهر ينقل الماء من مكان الى اخر، في عملية الكتابة سيكون المصدر البرنامج و المخزن ملف نصي مثلا و في عملية القراءة سيكون العكس ، المصدر هو الملف النصي و المخزن هو البرنامج.
2- فايل كلاس :
اي انستنس من هذا الكلاس سيحوي عنوان ملف او مجلد ، في ويندوز مثلا عندما نريد الاشارة الى ملف يكون العنوان بهذا الشكل :
كود:
C:\BlueJ\README.TXT
هذا العنوان نسميه باث نيم PathName
في لينكس و يونكس و حتى ابل ماك OSX نستخدم باك سلاش لكي نفصل بين المجلدات مثلا في جهازي على لينكس ( فيدورا ) عندما اريد الاشارة الى ملف ما سيكون العنوان بهذا الشكل :
كود:
/home/ali/Desktop/ali.txt
لهذا فالغرض من هذا الكلاس هو الحصول على عنوان مجرد عن نظام التشغيل و محاولة التحويل الاتوماتيكي وقت الحاجة . و لكن الكورس سهل علينا لانه لا يعنى الا بنظام ويندوز .
عندما نتكلم عن العناوين هناك نوعين :

1- العنوان الكامل : و هو من اسمه يحوي العنوان كاملا و يبدا من اعلى مجلد ممكن مثلا في ويندوز C: و في لينكس /
2- العنوان النسبي : و هو افتراضية ان البداية تكون من مجلد العمل ، مثلا لو قلت file.txt فسيبحث عن هذا الملف في المجلد الفعلي وقت تنفيذ البرنامج ، لنقل ان المجلد الفعلي كان ali اذا سيبدا البحث من هذا المجلد .

بما ان العناوين مجرد نص سنلاقي مشكلة لو نفذنا هذا الامر مثلا :
كود:
System.out.println(“String\noor”);
بدلا من طباعة String\noor ستكون النتيجة : String
Oor
هذا سيحدث لان سلاش تعتبر حرف هروب و اذا اضيف لها حرف " ان " ستترجم على انها سطر جديد و لتخطي هذه المشكلة نكرر كتابة السلاش هكذا :
String\\noor
و لتبسيط الامور زيادة يقدم لنا الكورس مثود مساعد للحصول على عناوين الملفات و هو عبارة عن دايلوج بوكس لاختيار الملف و طريقة كتابته هكذا :
كود PHP:
OUFileChooser.getFilename(); 
طبعا بما ان المدخل سيكون نص يمكننا ان نسند القيمة الى اي متغير من نوع سترنج .
ملاحظة مهمة هنا انه عند ظهور مربع الحوار و عدم اختيار ملف بالضغط على cancel ستصبح قيمة المتغير null و هذا قد يتسبب في ظهور اكسبشن و سنتعلم طريقة السيطرة على الاسكبشنز لاحقا .
اخيرا هذا الميثود يمكن ان نمرر له قيمة مباشرة بدون الحاجة الى اظهار مربع الحوار هكذا
كود PHP:
OUFileChooser.getFilename(String); 
الان لدينا العنوان و يمكننا ان ننشيء انستانس جديد من كلاس فايل يشير الى هذا الملف هكذا :
كود PHP:
File myfile = new File(pathname); 
نلاحظ هنا وجوب تمرير متغير يحمل قيمة العنوان الى الكونستركتر .
و اركز هنا ان من المهم معرفة ان اي انستنس من نوع فايل لا يكتب اليه او يقرا منه ، هذه ليست مهمة هذا الكلاس هذا الاوبجكتس من هذا الكلاس مهمتها فقط الاشارة الى العنوان و الحصول على معلومات مهمة مثل هل العنوان يشير الى ملف او مجلد او هل هو موجود او لا.
الميثودز التي يمكن استخدامها مع هذه الاوبجكتس ( من نوع فايل ) :

exists()
يرجع ترو اذا كان الملف او المجلد موجود
isFile()
يرجع ترو اذا كان العنوان يشير الى ملف و ليس مجلد
isDirectory()
يرجع ترو اذا كان العنوان يشير الى مجلد و ليس ملف
canWrite()
يرجع ترو اذا كان الملف موجود و البرنامج يستطيع الكتابة اليه .


3- الكتابة و القراءة من الملفات النصية :

يجب ان نعرف ان عملية القراءة و الكتابة قد تواجه عدة مشاكل منها :
1- محاولة الكتابة الى ملف محمي
2- الكتابة الى ملف و الهارد ممتليء فلا يمكن التخزين
3- القراءة من ملف معطوب
هذه و غيرها من المشاكل قد ترمي الينا اكسبشنز ( استثناءات) مما يسبب فشل البرنامج فعليه يجب ان نتعامل مع الاكسبشنز و ان نحتويهم باستخدام Try – catch.. لكي يواصل البرنامج عمله في حال فشلت عملية الكتابة او القراءة.

اولا لنتعرف على انواع الاكسبشنز :

1- Unchecked : مثل محاولة القسمة على صفر، و هي باختصار الاستثناءات المعروفة و التي يتوقع حدوثها و على المبرمج نفسه ان يتأكد من عدم حدوثها باستخدام جمل شرطية و لكن جافا لا تجبرنا ان نعمل لها تراي و كتش بل سنواجه الخطا في وقت التنفيذ (الرن تايم) .
2- Checked : مثل محاولة القراءة من ملف معطوب ، و هي باختصار الاستثناءات الغير معروفة و الغير متوقع حدوثها ، هذا النوع يجب ان يوضع في تراي و كتش و الا سنواجه خطا وقت الكومبايل.
طيب كيف نعرف ان ميثود يرجع شكد اكسبشن ؟؟

الجواب من خلال الاطلاع على الهيدر الخاص بالميثود فاذا وجدنا في الهيدر جملة ثروز اكسبشن فهذا الاكسبشن من نوع checked و يجب ان نستخدم تراي و كتش ، مثال للهيدر :
Public FileWriter(File file) throws IOException

4- الكتابة الى ملف باستخدام FileWriter :-
الان لدينا اوبجكت من نوع فايل يحمل قيمة متغير يشير الى عنوان الملف ، و سنقوم بعملية الكتابة الى هذا الملف بانشاء اوبجكت جديد من كلاس فايل رايتر و سنمرر له فايل اوبجكت في الكونستركتر بهذا الشكل :
كود PHP:
FileWriter aFileWriter = new aFileWriter(aFile); 
و لكن يجب الانتباه الى وضع هذا الكود في try و من ثم استخدام اي ميثود نريده مثلا للكتابة الى الملف نستخدم ميثود write ، هكذا
كود PHP:
aFileWriter.write(‘H’); 
و بعد ان نكتب كل ما نريد يجب ان ننتبه الى اغلاق الملف باستخدام كلوز
كود PHP:
aFileWriter.close(); 
هذا الامر ضروري لكي لا نترك الملف مفتوحا مما قد يسبب مشاكل كثيرة منها مثلا عدم القدرة على التعامل مع الملف او عدم القدرة على حذفه او ....الخ
بقيت ملاحظة اخيرة ان اعادة فتح ملف و الكتابة اليه سيتسبب بمسح المعلومات الموجودة سابقا فاذا لم نكن نرغب في مسح المعلومات الموجودة بل نريد الحاق المعلومات الى نهاية الملف يجب ان نستخدم الكونستركتر البديل و هذه طريقة كتابته :
كود PHP:
FileWriter ourFile = new FileWriter(afiletrue); 
قبل ان انهي هذا القسم فقط اشير الى طريقة كتابة الكتش ، و هو الجزء المسؤول عن التعامل مع اي استثناء ، طبعا هنا الكثير ليقال و لكن الكورس اراحنا باعطائنا شكل موحد لكل الكتش و لم يطالبنا بالتعامل الدقيق مع كل نوع من الاستثناءات ، فاذا احفظوا هذا الكود عن ظهر قلب و هو بكل بساطة يرجع لنا تفاصيل الخطا في حال حدوث استثناء :
كود PHP:
catch (Exception anException)
    {
        
System.out.println("Error:"+anException);

5- القراءة من ملف :-

و هي تقريبا نفس العمليات و لكن باستخدام كلاس FileReader
كود PHP:
FileReader myFile = new FileReader(afile); 
طبعا ميثود القراءة بيكون read و لكنه يرجع قيمة رقمية فيجب ان نعمل عملية كاستنج الى "شار" اي حرف لكي نستطيع ان نقرا الحروف و المهم ان نعرف ان الميثود سيرجع قيمة -1 عندما يصل الى نهاية محتوى الملف الذي يقرا منه ، لكل هذا سنحتاج الى دائرة تكرار بسيطة لقراءة محتوى ملف و ستكون بهذا الشكل :
كود PHP:
while (ch != -1)
        {
System.out.print((charch);
        
ch myFile.read();} 
و لكي نجمع كل ما عملناه في برنامج كامل ، ساضيف لكم برنامج صغير يقوم بالكتابة الى ملف و من ثم يقرا ما كتبناه تجدونه مع مزيد من الشرح في المرفق ..

انتهى الكلام عن هذين الكلاسين و لله الحمد و سيتبع باذن الله الكلام عن (البفرز) ...
الصور المرفقة
نوع الملف: jpg WriteAndRead.jpg‏ (61.6 كيلوبايت, المشاهدات 487)

التعديل الأخير تم بواسطة ali4ali ; 01-01-2010 الساعة 02:22 AM
ali4ali غير متصل   رد مع اقتباس
قديم 01-01-2010, 02:45 AM   #2
vip_of_all vip_of_all غير متصل
طالب فعال
 
الصورة الرمزية vip_of_all

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


شرح مميز من شخص مميز يضاف الى مكتبة اعمالك
ومكتبة المدخلات والمخرجات تزخر بالكلاسات الجاهزه واللتى تسهل التعامل مع المعطيات
كود PHP:
import java.io.*; 
iinput ooutput 
و بالاضافه الى ماذكرت ينتمى اليها ايضا السكانر وهو موجود معنا فى المنهج
تقبل مروري
مع اطيب التحايا
vip_of_all غير متصل   رد مع اقتباس
قديم 01-01-2010, 02:58 AM   #3
شمس لاتغيب شمس لاتغيب غير متصل
طالب فضي
 
الصورة الرمزية شمس لاتغيب

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله



ماا شااء الله عليك ..

صراحة مجهود جبار ..

بارك الله فيك علي ..
شمس لاتغيب غير متصل   رد مع اقتباس
قديم 01-01-2010, 03:56 AM   #4
vip_toop vip_toop غير متصل
طالب جديد

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


والله وحبيت الجافا بعد هذي المحاضره وصرت انتظر اللي بعدها
شرح وافي ومفهوم
vip_toop غير متصل   رد مع اقتباس
قديم 01-01-2010, 04:03 AM   #5
яσšємαяу яσšємαяу غير متصل
طالب فعال
 
الصورة الرمزية яσšємαяу

 










افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


روووووووووووووووووعه يا علي بجد مجهود رهيب شكرا

والله يوفقك بالماده
яσšємαяу غير متصل   رد مع اقتباس
قديم 01-01-2010, 04:03 PM   #6
ali4ali ali4ali غير متصل
طــالب
 
الصورة الرمزية ali4ali

 











رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


بسم الله الرحمن الرحيم

:: و اصلي و اسلم على سيد المرسلين محمـــد و اله الطاهرين ::


البفرز :-

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

فما يحدث هنا يمكن ان يقسم الى قسمين :

الاول هو عملية ارسال البرنامج البيانات و المعلومات الى الميموري و هي عملية سريعة جدا كما نعلم و لكن القسم الثاني و هو عملية كتابة هذه المعلومات من قبل نظام التشغيل الى الملفات في الهارد عملية بطيئة . لكل ذلك قد تتسبب عملية الكتابة باستخدام هذين الكلاسين الى بطء شديد في البرنامج . و لحل مشكلة عدم توازن القدرات هذه يجب ان نستخدم البفرز .

و لفهم مهمة البفرز بشكل افضل ضرب لنا كاتب اليونت مثالا رائعا ، تخيلوا البرنامج كالسماء تمطر بشكل سريع هنا الارض ستتشبع و سيضيع الماء بدلا من الاستفادة منه بعد يومين او اكثر . لذلك يقوم المزارعون بحفظ الماء في خزان عملاق ليسقوا الارض كلما احتاجت.
نفس الفكرة في البرامج بدلا من اجبار البرنامج على خفض سرعته لكي يوازن بين الاصدار و الكتابة الفعلية ، نقدم خزان مؤقت (بفر) يمكن البرنامج من ان يكتب اليه بسرعة عالية و من ثم يتكفل هذا الخزان بتنسيق عملية الكتابة الى الملف . اذا الفكرة هي فصل الاعتمادية بين البرنامج و الملفات .

الان و قد عرفنا الية عمل البفرز كيف نستخدمها ؟

اول نقطة يجب الانتباه اليها ان الكونستركتر لبفر رايتر لا يقبل ارجيومنت من نوع فايل بل من نوع رايتر ، اذا نحن هنا نواصل ما قمنا به سابقا من عمليات .. و الاعلان سيكون هكذا :-

كود PHP:
BufferedWriter myBuffer = new BufferedWriter(new FileWriter(myFile)); 
لاحظوا هنا اننا انشئنا انستانس فايل رايتر داخل انستنس بفرد رايتر ( هذه العملية تسمى Wrapping ) و ذلك لاننا لن نحتاج الى ان نشير للفايل رايتر لاحقا و الا فامكانية انشاء الانستانس هذا خارج البفرد ممكنة.

الان اصبح لدينا امكانية مميزة الا و هي اننا الان نستطيع ان نكتب النصوص الى البفر و بعد ان يمتليء البفر يمكننا ان نكتب البيانات دفعة واحدة من خلال الفايل رايتر ستريم الى الملف على شكل Array. بهذا تفادينا عملية الكتابة المكررة و جعلنا العملية مجرد عملية كتابة واحدة و لكن بدفعة اكبر و هذه الطريقة اكثر سرعة .
تجدر الاشارة هنا الى ان استخدام ميثود close مع انستانس من نوع بفرد سيؤدي تلقائيا الى دفع كل المعلومات الى الستريم قبل ان يغلق الانستانس .

و الان عملية القراءة هي ذاتها عملية الكتابة و لكن باستخدام كلاس بفرد ريدر .
كود PHP:
BufferedReader myBuffer = new BufferedReader(new FileReader(myFile)); 
المميز هنا اننا الان لدينا ميثود readLine لقراءة سطر كامل بدلا من قراءة حرف واحد كما كنا نعمل سابقا . و في بفرد رايتر لدينا ميثود newline لاضافة سطر جديد بشكل مستقل عن نظام التشغيل .

الان لنجمع كل ما تعلمناه و نكتب برنامجين بسيطين لتوظيف كل الاشياء التي تعلمناها مع البفرز :

1- الاول للكتابة
2- الثاني للقراءة

تجدونها في المرفقات مع مزيد من الشرح...

تم بحمد الله الكلام عن هذين الكلاسين و سيأتي الكلام ان شاء الله عن التعامل مع الاوبجكتس ..
الصور المرفقة
نوع الملف: jpg BufferedWriter.jpg‏ (40.1 كيلوبايت, المشاهدات 328)
نوع الملف: jpg BufferedReader.jpg‏ (61.9 كيلوبايت, المشاهدات 355)
ali4ali غير متصل   رد مع اقتباس
قديم 01-01-2010, 04:09 PM   #7
ali4ali ali4ali غير متصل
طــالب
 
الصورة الرمزية ali4ali

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


:: الاخوان و الاخوات الافاضــــــــل ::

Sara
Vip of all
شمس لا تغيب
vip toop
iGirl
rosemary


شكرا لتشريفكم اياي و الحمد لله اننا كنا عند حسن ظنكم ...

تحية و احترام
ali4ali غير متصل   رد مع اقتباس
قديم 01-01-2010, 09:51 PM   #8
Learner Learner غير متصل
طالب فضي
افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


ماشاء الله تبارك الله
الله يجزاك ألف خيييييير على هالشغل المرتّب ياعلي

صراحة الوحدة دسممممة :s
والسيرياليزيشن هذا يبغاله قعدة لحاله

الله يعطيك العافية و الله يجعله يميزان أعمالك يارب
Learner غير متصل   رد مع اقتباس
قديم 01-01-2010, 10:36 PM   #9
Sweet-Dream♥ Sweet-Dream♥ غير متصل
طالب مميز
 
الصورة الرمزية Sweet-Dream♥

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


جزاك الله خييير ..
بموازين حسناتك يارب ..
الله يعين ويسهل ويعدي دا السميستر على خير
Sweet-Dream♥ غير متصل   رد مع اقتباس
قديم 02-01-2010, 02:22 AM   #10
ـغ ــزآل ـغ ــزآل غير متصل
طالب مميز
 
الصورة الرمزية ـغ ــزآل

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


جزاك الله خير وفقك لما يرضاه..

شرح جميل ..وواضح ومفهوم..

يعطيك العافيه اخوى
ـغ ــزآل غير متصل   رد مع اقتباس
قديم 02-01-2010, 01:13 PM   #11
angel 2 angel 2 غير متصل
طالب فعال

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


جزاك الله عنا كل الخير
angel 2 غير متصل   رد مع اقتباس
قديم 02-01-2010, 01:42 PM   #12
ali4ali ali4ali غير متصل
طــالب
 
الصورة الرمزية ali4ali

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


الافاضل :

ليرنر
سويت دريم
غزال
انجل

شكرا لتشريفكم اياي ..

ارجو المعذرة من اخواني الطلاب فاني ساتغيب عن المشاركة هنا الى يوم الثلاثاء لاداء كويزين 209 و mst ..
سأحاول جهدي ان اكمل ما بدات يوم الاربعاء ان شاء الله

تحية
علي
ali4ali غير متصل   رد مع اقتباس
قديم 02-01-2010, 02:12 PM   #13
ali4ali ali4ali غير متصل
طــالب
 
الصورة الرمزية ali4ali

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


مكرر ... معذرة
ali4ali غير متصل   رد مع اقتباس
قديم 02-01-2010, 02:14 PM   #14
ali4ali ali4ali غير متصل
طــالب
 
الصورة الرمزية ali4ali

 











افتراضي رد: شرح و ملخص يونت 12 بالعربي ان شاء الله


مكرر ... ارجو الحذف
ali4ali غير متصل   رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع


الساعة الآن 03:25 AM.


Powered by vBulletin® Version 3.8.1, Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. TranZ By Almuhajir
جميع المواضيع والمشاركات تعبر عن وجهة نظر أصحابها
ولا تعبر باي شكل من الاشكال عن وجهة نظر منتديات AOUA
تصميم وتطوير : التكنولوجيا الماسية