Banner Advertisement
 
Advertisements
 
پربيننده‌ترين مطالب
در هفت روز گذشته
 
آخرين خبرها
 
جديدترين مقالات
 
 
ارسال براي دوستان
نسخه مناسب چاپ
پنگوئن دات‌نت! - mono ابزاري منبع‌باز براي اجراي برنامه‌هاي مبتني بر دات‌نت روي پلتفرم‌هاي مختلف

ترجمه: عرفان نظري‌فاضل‌
ماهنامه شبکه - آذر ۱۳۸۵ شماره 71

اشاره :

زماني كه با دنياي مرموز و جذاب لينوكس آشنا شد،‌اولين سؤالي كه به ذهنش رسيد اين بود: چگونه مي‌توان تحت آن برنامه نوشت؟ در اصل او در تمام دوران برنامه‌نويسي‌ خود، براي سكوهاي مايكروسافت (از داس تا ويندوز‌اكس‌پي) برنامه نوشته بود، اما آيا راهي وجود داشت تا با دانسته‌هايش در NET.، براي لينوكس نيز برنامه بنويسد؟ آري. پاسخ سؤال او يك كلمه بود: Mono؛ ابزاري كه نه‌تنها تجربيات دات نت كاران را به سرزمين لينوكس هديه مي‌كرد، ارمغاني نيز براي كاربران اپل (يا Mac OSX) بود. شايد به همين علت ناول،Mono را گامي مؤثر در توسعه لينوكس مي‌داند.


Mono چيست؟
Mono پروژه‌اي است كه توسط شركت ناوِل (پيش‌تر توسط Ximian) براي ايجاد و توسعه ابزارهايي منطبق بر دات‌نت در دنياي اپن‌سورس رهبري مي‌شود. مونو قابليت اجرا روي لينوكس، FreeBSD ،UNIX ،Mac OSX و ويندوز را دارد و  سكوهاي مورد پشتيباني آن همچنان در حال افزايشند. كامپايلر، #C و ابزارهاي آن در Mono تحت مجوز GPL، كتابخانه‌هاي run time آن تحت LGPL و Class Libraryهاي آن تحت مجوز MIT عرضه مي‌گردند. نتيجه اين‌كه مونو يك نرم‌افزار منبع‌باز و مجاني است.

مونو همچنين حاوي يك موتور Just -in-Time) JIT) سازگار با پروسسورهاي
 X86 ،SPARC ،PowerPC ،ARM ، S390 ،X86-64، IA64 و SPARC در حالت 64 بيتي است.

شكل 1

به طور خلا‌صه در مورد عملكرد و كاربرد مونو مي‌توان گفت كه: مونو ابزاري براي كامپايل و ايجاد اسمبلي‌ها و برنامه‌هاي كاربردي نوشته شده با قابليت‌هاي دات‌نت است و اين امكان را مي‌دهد تا يك كد يكتا بدون نياز به بازنويسي يا كامپايل مجدد روي پلتفرم‌هاي مورد پشتيباني (كه در بالا‌ آمد) به راحتي و آساني قابل اجرا باشد. مي‌توان گفت كه مونو عملكردي مشابه چهارچوب Common Language Infrastructure) CLI) دات‌نت مايكروسافت دارد؛ با اين تفاوت كه مونو چهارچوبي كلي‌تر و مجاني براي پلتفرم‌هاي گسترده‌تر فراهم مي‌كند.

با اين‌كه تعداد زيادي از برنامه‌نويسان و توسعه‌دهندگان نرم‌افزار در سطح جهان به ابزارهاي مبتني بر ويندوز و دات‌نت عادت كرده‌اند،‌ زمان آن رسيده است بدانيد كه مي‌توانيد اسمبلي‌هاي دات‌نت را روي سكوهاي Mac OSX ،Solaris ،AIX و تعداد زيادي از لينوكس‌ها كامپايل و اجرا كنيد. در حالي كه Cross-Platform (يا استقلا‌ل نسبت به سكوي كاري) بودن اين چارچوب كاري (يعني مونو) به برنامه‌هايي از قبيل Hello World محدود نشده است و مي‌توانيد به آساني با مونو، اسمبلي‌هاي آماده توليد مبتني بر ADO.NET،‌ فرم‌هاي ويندوز، ASP.NET و ... را ايجاد و اجرا كنيد.

نصب Mono 
براي شروع كار در ويندوز، بايد نسخه مخصوص ويندوز MONO را دانلود و نصب نماييد.
پس از دريافت فايل Mono Installer for Windows آن را اجرا كنيد و پروسه نصب را پي بگيريد. توجه داشته باشيد كه Mono هيچ تداخلي با Microsoft.NET يا MS Visual Studio از قبل نصب شده نخواهد داشت.

در زمان تهيه اين مقاله، بهترين و آخرين نسخه عرضه شده مونو، 1.15 است. اگر بعد از نصب به دايركتوري اين نسخه از مونو مراجعه كنيد، با تعداد زيادي از زير پوشه‌ها از جمله etc ،contrib ،man ،share و ... مواجه خواهيد شد. (كه براي كاربران لينوكس آشناست) (شكل 1). شكل 1 ساختار پوشه مونو را نشان مي‌دهد.

در اين مقاله فقط با فولدرهاي ‌bin/ (كه حاوي بسياري از ابزارهاي مونو از جمله كامپايلر #C)، 
Global Asscmbly Cache: GAC lib\mono\gac چارچوب كاري مونو) سروكار خواهيم داشت.

چون اكثر ابزارهاي مونو را از دايركتوري ‌bin\ و از طريق خط فرمان اجرا خواهيد كرد، لذا بهتر است آدرس آن را به متغير محيطي Path سيستم‌عامل خود اضافه كنيد. براي سهولت در كار، مي‌توانيد از خط فرمان MONO استفاده كنيد. اين ابزار مي‌تواند به طور خودكار ابزارهاي خط فرماني را شناسايي كند وآن‌ها را به كار گيرد. آدرس اين كنسول: Start>All Program >Mono For Windows> Applications حال براي اطمينان از صحت نصب، فرمان زير را وارد كنيد:

mono-- version

اگر همه كارها به درستي انجام شده باشد، جزئيات بسياري مطابق آنچه در تصوير شماره 2 نشان داده شده است، نمايش داده خواهد شد. 

شكل 2

فهرست 1

كامپايلرهاي Mono

مونو، همانند توزيع CLI مايكروسافت، حاوي تعدادي كامپايلر مديريت شده است. اين كامپايلر عبارتند از:
 
‌‌ كامپايلرهاي #mcs.exe : C و gmcs  
‌‌‌كامپايلر BASIC مونو: mbas.exe
‌‌‌كامپايلر زبان booc.exe :Boo 
‌‌‌كامپايلرهاي CIL مونو: IIasm.exe, ilasm.exe 

در اين مقاله فقط از كامپايلرهاي #C استفاده خواهيم كرد، اما در مورد كامپايلر بيسيك مونو بايد گفت كه يك مجموعه كامل و غني از Visual Basic.NET است كه با هدف ايجاد و توسعه يك زبان برنامه‌نويسيِ به آساني قابل فهم براي آنان در دنياي لينوكس / يونيكس و Mas OSX عرضه شده است و همچنان در حال توسعه و بازبيني قرار دارد. Boo نيز يك زبان شي‌ء‌گرا از نوع ايستا است كه بر مبناي Python نوشته شده است. براي آشنايي بيشتر با اين كامپايلر به اين سايت مراجعه كنيد. llasm.exe و ilasm.exe نيز كامپايلرهاي CIL مونو هستند كه دومي از ساختارهاي زباني NET 2.0 پشتيباني مي‌نمايد.

كار با كامپايلرهاي #C
mcs.exe اولين #C بود كه براي پروژه مونو در نظر گرفته شد. اين كامپايلر با 1.1#C مطابقت كامل دارد (در حقيقتmcs.exe با #C نوشته شده است) و همانند كامپايلر خط فرمان مايكروسافت يعني (csc.exe) از response fileها پشتيباني مي‌كند. يعني كه مي‌توانيد با اضافه كردن فلگ‌هاي /target ،/out ،/reference و ... به ترتيب نوع اسمبلي، نام اسمبلي كامپايل شده و وابستگي‌هاي خارجي فهرست اسمبلي را براي كامپايلر تعيين كنيد. مي‌توانيد تمام آپشن‌هاي قابل استفاده در mcs.exe را با دستور زير مرور كنيد:

 ؟- mcs.exe  

 gmcs.exe يا(genericmcs.exe) نسخه‌اي از mcs.exe است كه از #C مخصوص NET 2.0 و ارجاع‌هاي كتابخانه‌هاي پايه‌اي كلا‌س مبتني بر NET 2.0 پشتيباني مي‌كند. در حقيقت تفاوت اين دو كامپايلر در اينجاست كه mcs.exe به طور خودكار به Base Class Libraryهاي مبتني بر NET 1.1 مراجعه مي‌كند، در صورتي كه gmcs.exe به طور پيش‌فرض از Base Class Libraryهاي مبتني بر NET 2.0 به عنوان مرجع استفاده مي‌نمايد. با اين حساب،gmcs.exe در آينده كامپايلر پيش‌فرض مونو خواهد شد و mcs.exe از دور خارج خواهد گرديد.

ايجاد يك Code Library دات‌نت با Mono
براي آشنايي با مونو در عمل، از ايجاد يك كتابخانه كه با نام Core LibDump.dll شروع مي‌كنيم. اين اسمبلي حاوي يك نوعِ تك كلا‌سه با نام CoreLib Dumper و داراي يك متد استاتيك با نام DumpTypeTo File است. اين متد يك رشته كه معرف يك نام معتبر از يك Type موجود درون mscorlib.dll را مي‌گيرد و اطلا‌عات مرتبط با آن Type را به يك فايل محلي در هاردديسك منتقل مي‌كند كه كامل اين برنامه در فهرست 1 آمده است. براي مثال، اگر پارامتر رشته‌اي ورودي به اين متد System.Threading.Thread باشد، فايل خروجي System.Threading.Thread.txt نام خواهد داشت. با اين‌كه مي‌توانيد اين برنامه را با واردكردن آرگومان‌هاي تعريفي به صورت مجزا كامپايل كنيد،  اين‌كار با استفاده از فايل‌هاي response ساده‌تر و راحت‌تر انجام مي‌پذيرد. براي اين كار، فايلي را با نامCorelibDumper.rsp در كنار فايل CoreLibDumper.cs ايجاد نماييد و مجموعه فرامين زير را در آن وارد كنيد:

target: library/
out: CorelibDumper.dll/
CoreLibDumper.cs

حال مي‌توانيد كتابخانه مذكور را با دستور زير كامپايل كنيد:
gmcs @corelibDumper.rsp‌

البته بدون فايل‌هاي rsp.* بايد كامپايل را اين‌گونه انجام مي‌داديد:

gmcs/target: library out:Corelib/.Dumper.dll
Corelib Dumper.cs

تخصيص يك نام قوي به CoreLib Dumper.dll 
مونو از ايجاد اسمبلي‌هاي نام قوي و به اشتراك‌گذاري شده در Global Assembly Cache) GAC) نيز پشتيباني مي‌كند. يعني مي‌توان كتابخانه‌اي را كه ايجاد كرده‌ايد، در GAC به صورت فراگير به اشتراك بگذاريد. براي ايجاد داده‌هاي كليدي public/private، مونو از sn.exe (كه كم و بيش مثل محصول مايكروسافتي هم نام خود عمل مي‌كند) استفاده مي‌نمايد. براي مثال، دستور زير يك فايل snk.* ايجاد مي‌كند: (براي كسب اطلا‌عات بيشتر از فلگ ؟ - در پايان فرمان استفاده كنيد).

sn/ k   myTest KeyPair.snk

حال براي اين‌كه به #C بگوييم از اين كليد ايجاد‌شده براي تخصيص يك نام قوي به كتابخانه CoreLibDumper.dll  استفاده كند، بايد فايل CoreLibDumper.rsp را به صورت زير درآوريد:

target: library/
out: CoreLibDumper.dll/
Keyfile: myTest KeyPair.snk/
CoreLibDumper.cs
حال با فرمان زير، كتابخانه خود را دوباره كامپايل مي‌كنيم:

gmcs @corelibDumper.rsp‌

مشاهده فهرست بروزرساني‌شده با monodis.exe 
قبل از قرار دادن اسمبلي در GAC، در مورد monodis.exe (كه عملكردي مشابه ildasm.exe مايكروسافت دارد) بدانيد كه مي‌توانيد با استفاده از آن، كُد CIL، فهرست كلي و انواع metadata براي يك اسمبلي مشخص را مشاهده كنيد.

مثلا‌ً مي‌خواهيم اطلا‌عات مربوط به اسمبلي نام قويِ جديدي كه ايجاد كرده‌ايم را با سوييچ assembly مشاهده كنيم. شكل 3 پاسخ به دستور زير را نشان مي‌دهد:

monodis-- assembly   CoreLibDumper.dll
همان‌طور كه مي‌بينيد، فهرست كلي اسمبلي، حاوي كليدي كه در myTest keypair.snk ايجاد كرديم نيز مي‌باشد.

شكل 3

شكل 4

نصب اسمبلي‌ها در GAC
 
حال كه يك كتابخانه strong-name ايجاد كرده‌ايم، بايد آن را توسط ابزار gacutil.exe در GAC نصب كنيم. همانند ابزار مشابه مايكروسافتي كه به همين نام عرضه شده است، gacutil.exe براي نصب، uninstall و مرور اسمبلي‌هاي ساخته شده كاربر در GAC مورد استفاده قرار مي‌گيرد. (توجه كنيد كه GAC در دايركتوري
ProgramFiles\Mono\lib\mono\gac\... قرار دارد).

دستور زير CoreLib Dumper.dll را به صورت يك اسمبلي به اشتراك‌گذاري شده در ماشين محلي در Global Assembly Cache نصب مي‌كند. (از خط فرمان مونو براي اين‌كار استفاده كنيد):

gacutil- i   CoreLibDumper.dll

حال بايد بتوانيد يك پوشه جديد با نام CoreLibDumper در پوشه gac \...(مسير اصلي اين پوشه در بالا‌ ذكر شد) ببينيد. شكل 4  اين پوشه را در فولدر GAC نمايش مي‌دهد.

ايجاد يك Console Application با مونو
بياييد يك كلا‌ينت ساده كه آن را ConsoleClientApp.exe خواهيم ناميد ايجاد كنيم. يك فايل جديد با نامConsoleClientApp.cs بسازيد و كد آورده شده در فهرست 2 را در آن وارد كنيد. 

فهرست 2


دقت كنيد كه متد () main از كاربر نام يك نوعِ كاملا‌ً تعريف شده را درخواست خواهد كرد. متد ()TypeDumper.DumpTypetofile نيز از نام وارد شده توسط كاربر براي بازيابي Type و ارسال اطلا‌عات آن به يك فايل متني استفاده مي‌كند. حال يك فايل ConsoleClient App.rsp ايجاد نماييد و كد زير را در آن وارد كنيد: (اين فايل به Corelib Dumper.dll رجوع خواهد كرد.)

target: exe/
out: Console ClientApp.exe/
reference: CoreLibDumper.dll/
ConsoleClientApp.cs

حال براي ايجاد فايل اجرايي، كد بالا‌ را با دستور ذيل كامپايل مي‌كنيم:

gmcs @consoleClinetApp.rsp‌
قبل از اجراي اين برنامه، فايل CoreLibDumper.dll را كه در دايركتوري جاري فايل اجرايي كامپايل شده قرار دارد، به DontuseCoreLibDumper.dll تغييرنام دهيد. دليل اين كار اين است كه شما اسمبلي خود را در GAC نصب كرده‌ايد و در صورت رجوع به آن در طي اجراي برنامه‌، از كپي نصب شده در GAC استفاده خواهيد كرد، نه نسخه محلي كتابخانه CoreLibDumper.dll.

پس از انجام مراحل بالا‌، حالا‌ مي‌توانيم ConsoleClientApp.exe را در موتور زمان اجراي Mono با دستور زير اجرا كنيم:

Mono  ConsoleClientApp.exe

اكنون، براي مثال System.Threading.Thread را وارد كنيد. برنامه، Type مورد نظر را جست‌وجو مي‌نمايد و در نهايت يك فايل با نام System.Threading.Thread.tex ايجاد خواهد كرد كه حاوي تعريف‌هاي metadata اين نوع خواهد بود. شكل 5 محتويات فايل مذكور را نشان مي‌دهد.
 

شكل 5


قبل از آن‌كه به ايجاد برنامه‌هاي كاربردي مبتني بر فرم‌هاي ويندوز بپردازيم، اين آزمايش را انجام دهيد: با استفاده ازWindows  Explorer، پوشه كاري خود را باز نماييد و سعي كنيد با دوبار كليك روي فايل ConsoleClientApp.exe، آن را اجرا كنيد. همان طور كه مي‌بينيد، اين كار باعث رخ دادن FileNotFoundExeption خواهد شد. ممكن است تصور كنيد اين اتفاق به دليل تغيير نام CoreLibDumper.dll افتاده است. اما بايد بدانيد كه دليل اصلي آن است كه با دوبار كليك روي اين فايل، آن را از طريق Microsoft CLR اجرا خواهيد كرد.

به ياد داشته باشيد كه براي اجراي برنامه‌ها تحت مونو، بايد آن‌‌ها را توسط Mono.exe اجرا نماييد. در غير اين‌صورت، برنامه كاربردي از طريق Microsoft CLR (كه از اسمبلي‌هاي اشتراكي نصب‌شده در Microsoft GAC و واقع در دايركتوري Assembly\ استفاده مي‌كند) اجرا خواهد گرديد. در مواردي خاص ممكن است برنامه بدون مشكل اجرا گردد. در اين حالت فقط مي‌توانيد از اسمبلي‌هاي NET. استفاده نماييد و در صورت رجوع به كتابخانه‌هاي ايجاد شده توسط خودتان، با FileNotFoundExeption مواجه خواهيد شد.

ايجاد يك برنامه كاربردي بر مبناي فرم‌هاي ويندوز
قبل از ادامه كار، DontuseCoteLibDumper.dll را به همان نام قبلي يا CoreLibDumper.dll تغيير نام دهيد. سپس يك فايل جديد #C ايجاد نماييد و آن را WinFormsClientApp.cs بناميد.

در اين فايل دو type با استفاده از قابليت‌هاي 2.0 #C تعريف شده و چند كلا‌س ايستا به همراه متدهاي ناشناس به كار رفته‌اند كه در فهرست 3 موجود است.

فهرست 3


باز هم مثل قبل، پيش از كامپايل يك فايل rsp.* با نام WinFormsClientApp.rsp ايجاد نماييد و فرامين زير را در آن وارد كنيد:

target: winexe/
out: WinFormsClientApp.exe/
reference: CoreLibDumper.dll/
reference: System.Windiws.Forms.dll/
reference: System.Drawing.dll/
WinFormsClientApp.cs

حال با فرمان زير، پروژه را كامپايل كنيد:
 
gmcs @winformsClientApp.rsp

در صورتي كه برنامه كامپايل شده را با mono.exe اجرا كنيد، چيزي مشابه شكل 6 مشاهده خواهيد كرد.

شكل 6

جمع‌بندي
تا اينجا چيز جديدي در مورد NET. يا #C مطرح نشد و تأكيد ما در اين مقاله طرز شروع كار با مونو بود. با اين‌كه در طي اين مقاله چند برنامه كاربردي ساده با مونو ايجاد كرديم، اما اهميت مونو در جايي واضح‌تر مي‌شود كه به شكل 7 دقت كنيد. اين تصوير همان برنامه مبتني بر Windows Forms را در حال اجرا در لينوكس Suse نمايش مي‌دهد.

شكل 7


نتيجه اين‌كه مي‌توانيد دقيقاً همان  كد ‌#C كه در اين مقاله با آن آشنا شديد را در لينوكس (يا هر سيستم‌عاملي كه توسط مونو پشتيباني مي‌شود) به راحتي كامپايل يا اجرا كنيد. در حقيقت، مي‌توانيد اسمبلي‌هايتان (كه فرضاً در Win 32  ايجاد شده‌اند) را به يك سيستم‌عامل جديد كپي نماييد و آن‌ها را مستقيماً و بدون نياز به كامپايل مجدد يا ايجاد تغييرات در كد، اجرا كنيد. تنها كار لا‌زم، استفاده از mono.exe است.

براي آشنايي بيشتر با مونو و افزيش توانايي‌هاي خود در اين زمينه، مي‌توانيد به راهنمايِ همراه مونو كه Mono Doc خوانده مي‌شود، مراجعه كنيد. اين راهنما، حاوي اطلا‌عات مفيدي در مورد كتابخانه‌هاي پايه‌اي كلا‌س مونو و زبان برنامه‌‌نويسي #C است. اين ابزار از طريق Start < All Programs < Mono for Windows< Applications  قابل دسترسي است.

شكل 8 نمايي از Mono Doc را نمايش مي‌دهد. البته در طي گشت‌وگذار در طي Mono Doc با مدخل‌هاي ناكامل زيادي روبه‌رو خواهيد شد؛ چراكه راهنماهاي كلا‌س‌هاي پايه‌اي مونو توسط Community مونو تهيه شده و در حقيقت شما نيز مي‌توانيد در تهيه و توسعه اين راهنما سهيم باشيد.

شكل 8

آنچه براي كندوكاو بيشتر و پيشرفت در مونو نياز داشتيد را به دست آوريد. ديگر لا‌زم نيست از ايجاد و توسعه ايده‌هاي ناب خود در دنياي مرموز و جذاب يونيكس/ لينوكس نگران باشيد. شايد اين قدمي كوچك، اما مؤثر در توسعه ابزارهاي قوي و قابل اعتمادي چون لينوكس/ يونيكس باشد. اميد آن‌كه در آينده مقالا‌ت عميق‌تر و فني‌تري در اين زمينه فراهم نماييم و در اختيار شما قرار خواهيم دهيم.

     
   
مطالب مرتبط
چرا نرم‌افزارها مي‌ميرند؟
( برنامه نويسي )
Debugger خود باشيد!
( برنامه نويسي )
مايكرو كاپوچينو! J2ME؛ جاوا در قلمرو موبايل‌
( برنامه نويسي )
يك داستان اپن‌سورس ‌- قسمت پاياني
( دات نت - برنامه نويسي )
اگر به جاي رييس مايكروسافت بودم...
( برنامه نويسي )
چگونه يك سرويس ويندوز بسازيم؟
( برنامه نويسي - دات نت )
آيا آندروئيد دگرگون‌‌ساز خواهد بود؟
( برنامه نويسي )
نگاهي به NET Compact Framework.
( دات نت - برنامه نويسي )
يك پنجره كوچولو براي تمام فصول‌؛ آشنايي با برنامه‌نويسي به زبان ++C براي ويندوز موبايل‌
( برنامه نويسي )
شوق برنامه‌نويسي‌
( برنامه نويسي )
نور فلاش يا پرتو نقره‌اي؟
( برنامه نويسي )
دات‌نت فريم‌ورك چگونه كار مي‌كند؟
( دات نت - برنامه نويسي )
Visual Studio 2008 در راه است!
( دات نت )
مسابقات برنامه‌نويسي دانشجويي ACM
( برنامه نويسي )
كدام زبان برنامه‌نويسي را انتخاب كنيم؟
( برنامه نويسي )
گارسون! يك پرس XML لطفاً
( برنامه نويسي )
پشت پنجره‌هاي زنده‌ - نگاهي به کيت توسعه نرم افزاري Windows Live
( برنامه نويسي )
تجمع گوگلولوژيست‌هاي باوفا!
( برنامه نويسي )
برنامه‌نويسي پاپ!
( برنامه نويسي )
چرا نرم‌افزارها باگ ‌دارند؟
( برنامه نويسي )
طراحي چابكانه - Agile Software Development
( برنامه نويسي )
تست نرم‌افزار در Agile Software Development
( برنامه نويسي )
كاپوچينوي رايگان!
( برنامه نويسي )
MSDN Library April 2007
( دات نت )
خودتان RSS Feed Reader بسازيد - نگاهي به فناوري RSS و ارزيابي آن‌
( برنامه نويسي )
همه چيز درباره‌ ASP.NET 2.0
( برنامه نويسي - دات نت )
(Extreme Programming (XP - روش نوين برنامه‌نويسي سريع
( برنامه نويسي )
وب‌سرويس دوباره تب مي‌كند
( برنامه نويسي )
ميانگين نظر خوانندگان از ميان 3 نظر ارسال شده :
خيلي ضعيف
متوسط
عالي
نظر شما درباره این مطلب چیست و به آن چه امتیازی می دهید؟ اگر پيرامون موضوع مطرح شده در اين مطلب (صرف ‌نظر از چگونگي ارائه آن در اينجا) نظر يا عقيده‌اي داريد، مي‌توانيد ديدگاه خود را با ما در ميان بگذاريد.
يادآوري:
1 - مجله شبکه هر ماه گزيده‌اي از نظرات، پيشنهادات و انتقادات بازديدکنندگان سايت را در بخش ويژه‌اي تحت عنوان "روي خط شبکه" به چاپ مي‌رساند.
2 - اگر مايليد پاسخ پيام شما را درصورت لزوم برايتان بفرستيم، حتما آدرس ايميل خود را بنويسيد.
3 - مي‌توانيد بدون نوشتن مشخصات و نظر خود يا همراه با آن، به اين مطلب نمره بدهيد - براي نمره دادن کافي است يکي از شش گزينه زير را انتخاب و دکمه ارسال را فشار دهيد
نام
Email
آدرس سايت
اگر از سيستم‌عامل ويندوز و مرورگر IE استفاده مي‌کنيد وضعيت صفحه کليد خود را در حالت انگليسي نگهداريد و از Ctrl+Shift براي تغيير زبان استفاده کنيد
 
نظر (حداکثر 1000 کاراکتر)
پيام شما شامل 0 کاراکتر است
 
 
 

کلیه حقوق مادی و معنوی این سایت متعلق به ماهنامه شبکه می باشد

© 1998-2007 Shabakeh Magazine. All Right Reserved.

|
|
|
|
|
|