Archive for 2009/02

مروری بر Delphi 2009 و مهاجرت به آن

۱۳۸۷/۱۲/۰۶ ۱۵:۴۷ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۸۷/۱۲/۰۶ دسته بندی : ، ، 11

Delphi 2009

بعد از Delphi 7 که در زمان خودش (2001) کم نظیر بود نسخه های بعدی اون بسیار ضعیف ظاهر شدند. مخصوصا که شرکت Borland قصد داشت تا به سمت دات نت حرکت کند و این مورد به علت سیاست های ماکروسافت موفقیت پیدا نکرد. به هر حال پس از قضایای شرکت زیر مجموعه CodeGear و خریده شدن آن توسط Embarcadero سیاست دلفی تغییر کرد و مانند گذشته بر روی برنامه های سرویس دهنده و سرویس گیرنده تحت دسکتاپ تمرکز کرد.

اما اونچه که مد نظر من هست بررسی نسخه 2009 و ارزش مهاجرت به این زبان هست. برای همین باید اولین مورد یعنی به بررسی امکانات بپردازیم.

IDE
محیط توسعه دلفی در زمان نسخه 7 کامل بود ولی گذشت زمان نیازهای جدیدی رو مطرح می کرد که به تدریج به اون اضافه کرد. اما نسخه های مختلف عرضه شده بعد از اون بسیار ناپایدار بودند.
Delphi 7 بسیار پایدار است. تا حدی که به شخصه در مدت چهار سال استفاده کمتر از چند مورد با کرش مواجه شده بودم.
Delphi 8 بر روی توسعه دات نت تمرکز داشت
Delphi 2005 بسیار ناپایدار تا حدی که در برخی مواقع در کامپایل کردن هم باز می ماند.
Delphi 2006 همچنان ناپایدار ولی بهبودهایی حاصل شده بود.
Delphi 2007 همراه با ایجاد شرکت CodeGear بود و پایداری قابل قبولی داشت
Delphi 2009 نسخه فعلی که پس از خریده شدن CodeGear توسط embarcadero عرضه شده و پایداری خوب و قابل قبولی دارد دارد.

بررسی تعدادی از ویژگی ها Delphi 2009

Error Inside
این ویژگی خطاهای کد را در هنگام نوشتن شناسایی می کند و در همانجا نمایش می دهد. ویژگی بسیار بدرد بخوری است ولی در برخی مواقع قادر به شناسایی برخی کلمات رزرو شده که به ندرت استفاده می شوند نیست.

Resource Compiler
امکان اضافه کردن انواع فایل را به Resource مانند فایل یا تصویر به پروژه می دهد. پس از آن میتوان به این منابع از طریق کد دسترسی پیدا کرد. اگرچه این امکان قبلا نیز با تنظیم فایل های .res وجود داشت ولی هیچ ابزار UI برای آن در نظر گرفته نشده بود.

Refactor
این ویژگی بر میگردد به دو نسخه قبلی از دلفی ولی با این حال بسیار قابل توجه است. امکانات استاندارد Refactoring در این قسمت در نظر گرفته شده است. همچنین امکان Find Unit که در صورتیکه به دنبال تابعی هستید که نمی دانید در کدام Unit معرفی شده است می توانید از این مورد استفاده کنید.

پشتیبانی از Unicode
تمامی کنترل ها و محیط ویرایشگر دلفی از یونیکد پشتیبانی می کنند.

نتیجه
با توجه به پیشرفت های ذکر شده، با این حال محیط توسعه دلفی در مقایسه با محیط هایی مانند Visual Studio و Netbeans بسیار ضعیف عمل می کند و آنطور که انتظار می رود به خود کارسازی کارها کمک نمی کند.

زبان دلفی

زبان دلفی سه ارتقاع مهم داشته است. پیتیبانی از Unicode و Generic ها و پشتبانی از Anonymous متد ها یا متد های بی نام.

Generic ها این امکان را می دهند تا کلاس یا نوعی خاص بتواند در هنگام تعریف ورودی از هر نوعی را بپذیرد تا بتوان در هنگام استفاده نوع مورد نظر را تعریف کرد. یک نمونه مثال مانند زیر خواهد بود:
type
TPair<TKey,TValue>= class
private
FKey: TKey;
FValue: TValue;
public
function GetKey: TKey;
procedure SetKey(Key: TKey);
function GetValue: TValue;
procedure SetValue(Value: TValue);
property Key: TKey read GetKey write SetKey;
property Value: TValue read GetValue write SetValue;
end;

type
TSIPair = TPair<String,Integer>;
TSSPair = TPair<String,String>;
TISPair = TPair<Integer,String>;
TIIPair = TPair<Integer,Integer>;

متد های Anonymous
این نوع متدها بی نام تعریف می شوند و امکان ارجاع آنها به عنوان ورودی تابع با متغیری از نوع تابع وجود دارد. در این حالت امکان تعریف تابع درون کد تابع دیگر وجود خواهد داشت. برای مثال می توان به جای تعریف متدی جدید و سپس ارجاع آن به عنوان ورودی یک تابع دیگر، در همانجا تابع بی نام را تعریف کرده و به ورودی پاس کنیم.
این نمونه مثال از راهنمای دلفی است که به ویژگی MyEvent یک تابع بی نام اختصاص می دهد:
type
TProc = reference to procedure;
TMyComponent = class(TComponent)
private
FMyEvent: TProc;
public
property MyEvent: TProc read FMyEvent write FMyEvent;
end;

// function declaration
// http://salarblog.wordpress.com

var
c: TMyComponent;
begin
c := TMyComponent.Create(Self);
c.MyEvent := procedure
begin
ShowMessage('Hello World!');
end;

end;

پشتیبانی از Unicode
پشتیانی از Unicode مقداری برای دلفی سخت بود، چرا که شیوه ای که ذخیره کردن رشته ها در دلفی مورد استفاده قرار می گیرد، اگرچه سریع است ولی انعطاف کمی دارد. به هر حال این تغییر اعمال شده است. کامپوننت هایی که از رشته ها به عنوان بافر استفاده می کنند مطمئنن دچار مشکل خواهند شد چرا که روش ذخیره بافر مورد استفاده برای رشته در دلفی 2009 متغیر است و بستگی به نوع رشته دارد.

برای پشتیبانی از Unicode چند کلاس و نوع جدید ایجاد شده اند. کلاس TEncoding که شامل انواع تبدیلات است و نوع جدید UnicodeString که به طبع آن انواع مشابه و وابسته شامل WideString, AnsiString, ShortString,UTF8String و انواع اشاره گرهای آنها با پیشوند P.

دو Unit جدید WideStrUtils و WideStrings نیز برای کار و تبدیلات انواع رشته های یونیکد در نظر گرفته شده است. همچنین برای سازگاری با نسخه های قبلی دلفی نیز دستور کامپایلر UNICODE تعریف شده که استفاده از آن مانند زیر است:
{$IFDEF UNICODE}

اگر راهنمای دلفی را نصب کرده اید اینجا را برای انتقال پروژه خود به Unicode مطالعه کنید:
ms-help://embarcadero.rs2009/devcommon/enablingunicode_xml.html

کلاسهای افزوده شده:
در این میان چند کلاس کاربردی برای کار با Stream ها همانند TStringReader ، TStringWriter ، TStreamReader و TStreamWriter اضافه شده اند.
کنترل TButtonedEdit که کاربردی هم هست به همراه کنترل های زیر اضافه شده اند:
TButtonedEdit and TCategoryPanel (TPanel with a header to collapse and expand the panel) added to the ExtCtrls namespace
TCategoryPanelGroup, a container control that contains one or more collapsible panels
TCharacter class added to new Character namespace
TLinkLabel to add HTML links to a text label
TTListGroup, TListGroups to support groups on a list view
TEncoding and TStringBuilder added to SysUtils namespace (see A. Lanusse's Blog about TStringBuilder)
TCustomHint added to Controls namespace; added TBalloonHint inheriting from TCustomHint
TStringReader and TStringWriter added to Classes namespace to read and write strings using TTextReader/Writer interface
TStreamReader and TStreamWriter added to Classes namespace to read and write streams using TTextReader/Writer interface
http://salarblog.wordpress.com

اما مهمترین کنترل که به چشم میاد کنترل Ribbon با استفاده از کلاس TRibbon هست. این کنترل که ظاهر Office 2007 را شبیه سازی می کنند به راحتی و بدون نیاز به سایر کنترل های افزودنی قابل استفاده است.

راهنما
در این مورد دلفی بسیار بد عمل می کند. گرچه نسبت به نسخه های قبلی موارد بیشتری را پوشش می دهد  و راهنمای دلفی برای موارد اساسی خوب است ولی بیشتر مواقع که نیاز به مثال است هیچ مثالی ذکر نشده است.
در بیشتر مواقع نیز توضیحات بسیار ناقص هستند و در بخی مواقع اصلا توضیح وجود ندارد و فقط با جمله ای مانند This is SQLState, a member of class SQLException مواجه می شوید.

آیا از نسخه های قبلی مهاجرت کنیم
تجربه تلخ نسخه های مشکل دار قبلی کاربران را در امر مهاجرت با تردید مواجه کرده ولی ورژن 2009 از دلفی واقعا می تواند دلفی 7 دیگری باشد. همانطور که آمار نیز نشان می دهد درصد حرکت به Delphi از زمان عرضع نسخه 2009 بیشتر شده است.

موانع ارتقاء به 2009
مهمترین مانع پشتیبانی از یونیکد است. ممکن است در پروژه خود از ابزاری استفاده کرده باشید که مربوط به نسخه های قبلی دلفی باشد در این ممکن است که آن ابزار به خاطر عدم پشتیبانی از یونیکد در دلفی 2009 با مشکل مواجه شود.
در اینگونه مواقع باید منتظر باشید تا نسخه سازگار عرضه شود.

مهاجرت از سایر پلتفرم ها
بلی این مورد واقعا امکانپذیر است. شاید فکر کنید که دلفی در مقابل مجموعه عظیم امکانات و ابزارهای dotNET Framework و یا مجموعه Java کم خواهد آورد. ولی واقعا این طور نیست.
اگرچه دلفی در برخی مقوله های مانند برنامه نویس برای وب همانند مورد مشابه ASP.NET و JSP و برنامه نویسی فریم ورک هایی مانند WPF به طور جدی وارد نشده است اما اگر این موارد را در نظر نگیریم در برنامه نویسی تحت ویندوز دلفی تمامی موارد مورد نیاز را دارا می باشد.
دلفی تمامی موارد مورد نیاز را از پایه دارا می باشد و تنها نکته مهم در مورد ان این است که در فریم ورک هایی مانند dotNET مجموعه کلاسها و توابع به طور منسجم و یکپارچه تحت عنوان فریم ورک جمع اوری شده است. این درحالی است که مجوعه بسیار زیادی از ابزارهای کاربردی رایگان و پولی در سراسر برای دلفی وجود دارد.

همچنین زبان دلفی با دارا بود امکان نوشتن همزمان برنامه های سطح پایین و سطح بالا می تواند گزینه بسیار مناسبی برای بسیاری از مواردی باشد که امکان برنامه نویسی با dotNET و یا Java وجود ندارد.
نکته ای که در اینجا مطرح هست قدرت کم IDE است که اگر از سایر محیط های توسعه استفاده کرده اید ممکن این مورد شما را اذیت کند.

نتیجه
بی شک نسخه 2009 از دلفی یک ارتقاء عالی برای دلفی و برای برگشتن به دوران اوج خود هست اما تنها نکته بد در این مورد زمان از دسته در نسخه های قبلی است.
ارتقاء از نسخه های قبلی به این نسخه حتما توصیه می شود ولی باید در مورد کامپوننت ها و کد خود در مورد روشی که قبلا در کار با رشته استفاده کرده اید محتاط باشید.

همچنان دلفی می تواند قدرت Cpp را همراه با سادگی زبانهای سطح بالا در اختیارتان قرار دهد.

نوشته های سایر وبلاگ نویسان در مورد Delphi 2009
آیا دلفی 2009 می تواند دلفی 7 دیگری باشد!؟

Delphi و سیر نزولی آن در مقابل محصولات Microsoft

مروری بر Delphi 2009 و مهاجرت به آن

کتابهایی برای Delphi 2009
Delphi 2009 Handbook

 

ریستارت کردن سایت ASP.NET

۱۳۸۷/۱۱/۲۵ ۱۵:۱۵ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۸۷/۱۱/۲۵ دسته بندی : ، ، 1

در وبسایت های پر بازدید پیش میاد که به دلایل مختلفی مانند توسعه و یا تست قسمتی از سایت، یا سنگین شدن سایت به علت استفاده نادرست از رم و یا حملات احتمالی که ممکن است باعث سنگین شدن سایت بشود، نیاز به راه اندازی وبسایت پیش بیاد.
البته در مورد حملات این کار می تواند موفقتا مشکل را حل کند تا فرصت کافی برای راه حل اساسی پیدا کنید.
راه اندازی مجدد یا Restart باعث خواهد شد که تمامی محتویات کش، محتویات session و حافظه پاک شده و وبسایت بسته شود تا در درخواست بعدی به طور خودکار مجددا اجرا شود.

در ASP.NET یک متد اصلی برای این کار طراحی شده است و یک متد دیگر هم وجود دارد که این کار را انجام میدهد.

متد اول:
HttpRuntime.UnloadAppDomain()

این متد باعث پایان یافتن سایت می شود و تا رسیدن درخواست بعدی سایت مجددا اجرا نخواهد شد. نکته مهمی که در استفاده از این تابع است، فراخوانی رویداد Application_End در Global.asax است که به شما اجازه میده کارهای نهایی برای آزاد سازی حافظه را انجام بدید. مزیت اصلی این تابع طی کامل مراحل و عملیات آزاد سازی حافظه و پایان کار سایت است.

متد دوم:
HttpRuntime.Close()

این متد نیز همانند متد قبلی باعث پایان کار سایت خواهد شد و سایت در درخواست بعدی مجددا اجرا خواهد شد. نکته مهم در استفاده این تابع عدم فراخوانی رویداد Application_End هست. در حقیقت این تابع سایت را به یکباره متوقف می کند که هیچیک از مراحل پایان کار سایت اجرا نخواهند شد و می تواند برای مواقع اضطراری مناسب باشد.

نکته ای که در مورد HttpRuntime.Close هست این است که در حقیقت این مدت برای پاک کردن کش سایت طراحی شده، ولی ظاهرا این کار را با بستن سایت انجام می دهد که البته نتایجی مانند Restart کردن دارد! همانطور که گفته شد تفاوت عمده این مدت در این است مراحل بسته سایت به ترتیب انجام نشده و سایت به یکباره متوقف خواهد شد تا در خواست بعدی مجددا اجرا شود.

سعی کنید در قسمت مدیریت سایت خود صفحه ای را برای فراخوانی این دو مدت طراحی کنید.

 

راهنمای سریع و مرجع کامل Html و CSS

۱۳۸۷/۱۱/۲۲ ۱۷:۳۳ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۸۷/۱۱/۲۲ دسته بندی : ، ، 9


FireScope

به تازگی سایت SitePoint مرجعی را برای Html و CSS راه اندازی کرده که در این آدرس قابل دسترس است.

در این مرجع موضوعات به طور دسته بندی شده قرار گرفته اند که امکان یافتن موارد مورد نیاز از Html و Css را آسان میکنه. همچنین توضیحات و نحوه استفاده از هر مورد به طور کامل ذکر شده است. مثالهای دکر شده نیز قابل توجه هستند. قابلیت جستجو هم که جای خود دارد.

نکته مهمی که در رابطه این سایت می توان ذکر کرد، نمایش پشتیبانی مرورگرها از تگ ها و ویژگیهای css است. تیم این سایت کار زیادی را برای تعیین پشتیبانی های مرورگرها انجام داده اند که نتیجه آن قابل توجه هست. حداقل نسخه ای که مرورگر از ویژگی مورد پشتیبانی می کند ذکر شده و در صورتی که موردی به طور ناقص پشتیبانی شود، علت آن نیز ذکر شده است. همه این موارد همراه با استانداردی که تگ یا ویژگی مورد نظر در آن تعریف شده است می باشد.

پشتیبانی نسخه های مختلف از مرورگرهای Firefox , Internet Explorer , Opera , Safari ذکر است.

SitePoint Reference

ویژگی های این سایت مرجع به همین جا خلاصه نمی شه.

 

خواندن مطالب دیگر »

برای رضای خدا Internet Explorer را رها کنید

۱۳۸۷/۱۱/۱۷ ۲:۲۱ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۸۷/۱۱/۱۷ دسته بندی : ، ، 19

Don't hurt web with Internet Explorer
طبق آمارها تعداد کاربران Internet Explorer (به طور مخفف IE) از سایر مرور گر ها بیشتر است. زیاد بودن کاربران IE چند دلیل دارد. مهمترین دلیل تعداد کاربران ویندوز هست. از اونجایی که IE به صور پیش فرض بر روی ویندوز نصب است و مرورگر پیش فرض آن می باشد، بسیاری از افزاد اینترنت رو با نام Internet Explorer می شناسند و از وجود سایر مرورگرها بی اطلاع هستند.

متاسفانه تعداد کسیری از کاربران اینترنت از این دسته افراد هستند.

طبق آمار در ساعات اداری که کارمندان مشغول به کار هستند استفاده کنندگان از IE زیاد هست و پس از ساعات اداری هست که آمار استفاده از سایر مرورگرها به خصوص Firefox بالا می رود. این نشان دهنده این مورد هست که بیشتر کارمندان که دور از ذهن هم نیست که در این مقوله بی اطلاع باشند از IE استفاده می کنند.

هدف از مطرح کردن مطالب فوق، مشخص شدن دلایل استفاده از IE بود و در بعضی بحث ها که حتی در فروم های خارجی مشاهده می کنم، افراد دلیل استفاده از IE رو راحتی و روان بودن و توصیف می کنند، این درحالی هست که ممکنه تجربه ای از سایر مرورگرها نداشته و یا اینکه اگر هم داشته اند به آن مرورگر آشنایی نداشته اند تا از امکانات آن بهره بگیرند.

تصور نکنید که بحث فوق برای گشور های غربی مطرح هست. بلکه عینا این مسله برای ایران نیز صادق است.

طبق تجربه شخصی خودم اکثریت بازدیدکنندگان سایتهای عمومی از IE استفاده می کنند که شاید به چیزی حدود 95 درصد برسد. در حالی که سایت خودم که در زمینه برنامه نویسی هست و یک سایت قبلیم در حدود 65 درصد از IE و 26 درصد از Firefox و بقیه از سایر مرورگرها استفاده می کنند.

این درصد ها گفته های قبلی مبنی بر کم آگاهی از سایر مرورها رو تصدیق می کند.

این مقدمه ای بود بر وضعیت IE در میان کاربران.

اما بیایید ببینیم چرا باید Internet Explorer رو ترک کنیم!

*- اولین مورد که شاید هم طنز آمیز بیاید نفرین های طراحان وب است. من به عنوان کسی که مدتی به عنوان طراح وب کار می کردم و هم اکنون طراحی سایت SoftProjects را خودم انجام دادم و همچنین دوستانی دارم که طراح وب هستند، خاطرات زیادی از عذاب و شکنجه هایمان از در دست و پنجه نرم کردم با IE داریم.از زمان عرضه نسخه 6 از IE در سال 2002 تا کنون که نسخه 8 از IE درحال آمدن است. استانداردهای وب تغییرات زیادی کرده اند و مرورگرها پیشرفتهای بسیار زیادی کرده اند.

این درحالی است که مرورگر IE بسیار بد و تنبل حرکت کرده است و دست طراحان وب را برای استفاده از تکنولوژی های روز بسته مانده است.

این وقاحت تا جایی است که حتی تیم ماکروسافت استانداردهای وب را جدا از مسیر حرکت IE دانسته و از پیاده سازی آن در کوتاه مدت سر باز می زنند! برای لینک به اخر مطلب مراجعه کنید.

*- استاندارد و به روز بودن. مدتی هست که جنگ مرورگرها در محافل وب مطرح است. این جنگ بر روی کسب کاربران بیشتر از طرق مختلف است. مهمترین محور جنگ پشتیبانی از آخرین تکولوژی های وب است که استانداردها در راس قرار می گیرند.استانداردهای وب با این هدف ایجاد شدند تا جلوی ناهماهنگی در رفتار مرورگرها را بگیرند. مرورگرها در جهت هر چه بیشتر استاندارد شدن در رقابت با هم هستند. در حالی IE مانند یک غده مغرور همیشه مشکل ساز بوده است.

مهمترین این استانداردها شامل:

Html 5, CSS 2.1, CSS 3, SVG, APng و چند مورد دیگر

*- امنیت و قابلیت اطمینان. سایر مرورگرها و به خصوص Firefox درارای مشکلات امنیتی بسیار کمی هستند و به علت کد باز بودن، در صورتی که مشکلی یافت شود به سرعت رفع شده و در اختیار عموم قرار می گیرد.علاوه بر این در صورتی که مشکل امنیتی جدی باشد، مرورگر به صورت خودکار و به سرعت آخرین بسته اصلاحی را دریافت کرده و اعمال می نماید.

عملکرد ماکروسافت در این زمینه ضعیف بوده و معمولا برای رفع مشکلات امنیتی یک ماه تاخیر دارد و در چندین مورد مشاهده شده است که همان مشکل به درستی رفع نشده است. حتی در صورت عرضه نسخه اصلاحی به علت مشکل بودن اعمال بسته اصلاحی و کم اطلاعی افراد، بسیاری از افراد در مقابل حملات آسیب پذیر باقی می مانند.

*- قابلیت سفارش سازی.افزونه های نوشته شده برای IE به ندرت یافت می شوند. همچنین امکانات بسیار کمی برای سفارشی سازی مرورگر وجود دارد.

در مقابل سایر مرورگرها به خصوص Firefox با داشتن چند هزار افزونه که در نوع خود کم نظیر است می توانید امکانات فوق العاده ای به مرورگر خود اضافه کنید و یا تغییر پوسته آن را سفارشی کنید.

*- سرعت اجرای سایتهای Web 2این سایتها به علت استفاده زیاد از javascript در IE باعث کند شدن مرورگر می شوند. این درحالی هست سایر مرورگرها در زمان اجرای javascript شدیدا با یکدیگر مبارزه می کنند.

Don't hurt web with Internet Explorer

مراجع برای تحقیق مطالب فوق

به عنوان خلاصه مطلب لینک ها و مطالبی رو برای رجوع سریع مطرح می کنم.

مقایسه سرعت اجرای javascript که مثل همیشه IE آخر هستند

تست Acid 3 که میزان پشتیبانی از استانداردهای وب را نشان می دهید (به در صد IE8 توجه کنید!)

تکنولوژیها و جلوه های وب که کابران IE از آن محروم هستند:

طراحی سه بعدی مستقیما در خود مرورگر با استفاده از تگ Canvas

ویژگیهای جدید CSS 3 بخش 1

ویژگیهای جدید CSS 3 بخش 2

Don't hurt web with Internet Explorer

انتخابگر ها ( یا CSS Selector) که در نحوه شکل دهی ظاهر صفحات بسیار مهم هستند.
مرورگر خود را در مقابل CSS Selector ها بررسی کنید

حیله هایی که طراحان وب برای هماهنگی با IE استفاده می کنند:

حقه ای برای قعال کردن تگهای article,section و ... از Html 5 در IE

چند حقه برای شناسایی مرورگر IE

مشکل با تگ img

غرور و تکبر یا شاید هم سستی در پیاده سازی استانداردها:
Chris Wilson [MS] (Expert):

Q: What do you guys think of the Acid-tests, especially Acid3? Is it your goal to let IE 8 pass Acid3?

A: Alex, The ACID3 test is a collection of interesting tests, spread across a large set of standards. Some of those standards will see improvements in IE8 - in fact, IE8 already improves on IE7's score - but we are focused on the most important features and standards to make web developers' lives easier. The ACID3 test does not map directly to that goal.

پیشرفتهایی که در IE8 صورت می گیرد که به نظرم کمتر از حد انتظار هستند

و مراجعی برای تعداد کابران مرورگرها و غیره

تعداد کاربران سایتهای مشهور

تعداد کاربران سایت w3schools.com

بررسی کلی از ویژگیهای مرورگرهای مختلف

جنگ مرورگرها

مقایسه مرورگرها

Firefox از Chrome جلو می زند

ناتوانی مایکروسافت در رفع نقص امنیتی اینترنت اکسپلورر برای مدت 453 روز

با این اوصاف برای رضای خدا هم که شده در آشنا کردن افراد با سایر مرورگرها کوشا باشید

مشترک این وبلاگ شوید و آن را از طریق RSS دنبال کنید.