نصب و رفع مشکلات راهنمای Visual Studio 2010

11 05 2010

ماکروسافت در نسخه جدید Visual Studio سیستم راهنمای آن را که همنام با کتابخانه  راهنمای ماکروسافت به نام MSDN هست تغییر داده است. در این سیستم که اصطلاحا Help Viewer 1.0 نام دارد، دیگر از Document Explorer خبری نیست و راهنما می تواند در هر مرورگری نمایش داده شود. با این تفاوت که مرورگر پیش فرض صفحات راهنما، خود Visual Studio است.

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

  • نصب راهنما

پس از نصب موفقیت آمیز Visual Studio در صفحه پایان نصب، لینکی در پایین صفحه جهت نصب راهنما قرار داده شده که مستقیما از آنجا می توانید مراحل نصب را همانند زیر انجام دهید. لزومی نیست که حتما از آن لینک استفاده کنید، بعدا نیز می توانید راهنما را نصب کنید.

جهت نصب از طریق Visual Studio از منوی Help گزینه Manage Help Settings را انتخاب کنید. در صورتی که بار اولی است که از این گزینه استفاده می کنید از شما مسیر ذخیره سازی فایلهای آفلاین پرسیده خواهد شد. مسیر را با در نظر گرفتن اینکه ممکن است تا 3 گیگ فضا مورد نیاز باشد تایین کنید.

پس از آن می توانید از طریق گزینه «Choose online or local help» تعیین کنید که آیا از راهنمای آنلاین می خواهید استفاده کنید یا آفلاین. در صورت انتخاب گزینه آنلاین هیچ نیازی به نصب چیز دیگری نخواهید داشت و راهنمای از طریق سایت MSDN ماکروسافت نمایش داده خواهد شد.

در صورت انتخاب گزینه آفلاین سیستم راهنما از راهنماهای نصب شده استفاده خواهد کرد. پس نیاز خواهید داشت راهنماها را نصب کنید. نصب راهنمای آفلاین به سادگی از طریق نصب از دیسک نصب و یا دانلود امکان پذیر است. برای دانلود گزینه «Install content from online »  و برای نصب از دیسک گزینه «Install content from disk» را انتخاب کنید.

فایلهای راهنما در دی وی دی نصب موجود است و بهتر است بجای دانلود از آنها استفاده کنید. فایل نصب راهنما در مسیر DVD:\ProductDocumentation\HelpContentSetup.msha قرار دارد که باید از طریق گزینه Install content from disk اقدام کنید.

پس از اقدام به نصب می توانید از میان بخش های موجود، بخش های مورد نظر را انتخاب و اقدام به نصب یا دانلود کنید.

Help Library Manager

Help Library Manager

  • رفع مشکلات

پس از انجام عمل Repair برنامه نصب visual studio و یا به علت حذف ویا تغییر نا خواسته مسیر نصب فایلهای آفلاین سیستم راهنما به طور کل از کار می افتد و با اجرای مجدد Manage Help Settings جهت تغییر مسیر نصب و یا تغییر به وضعیت آنلاین، با خطا مواجه خواهید شد. در این وضعیت هیچ امکانی برای استفاده از راهنما نخواهید داشت. علاوه بر این در روشی که در ادامه توضیح می دم تقریبا هر مشکلی درباره نصب آفلاین راهنما رفع خواهد شد.

نمونه خطای سیستم راهنما

یکی از خطاهای سیستم راهنما

چند راه حل برای رفع این مشکل وجود دارد که ساده ترین آنها به این شکل است:

برنامه Regedit را باز کرده و به مسیر HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0  بروید. در آنجا مقدار LocalStore را پیدا کرده و پاک کنید. سپس مجددا گزینه Manage Help Settings را اجرا کنید تا مسیر نصب مجددا پرسیده شود. که می توانید در این حالت مسیر قبلی راهنماهای نصب شده را تعیین کنید.

  • برنامه کمکی H3Viewer

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

H3Viewer

H3Viewer

این برنامه کم حجم را می توانید از اینجا دریافت کنید (لینک دانلود در پایین صفحه): http://mshcmigrate.helpmvp.com/viewer

برنامه H3Viewer نیاز دارد تا سیستم راهنما در حالت آفلاین کار بکند، در این صورت می تواند راهنماهای نصب شده بر روی سیستم را لیست کند.

برای تنظیم مرورگر پیش فرض سیستم راهنما از طریق زیر منوی Options->Set default Viewer for MS HV 1.0 اقدام کنید. توجه کنید که برنامه باید با دسترسی administrator اجرا شده باشد.

پ.ن: در هر صورت وجود راهنمای اصلی نرم افزار لازم و ضروری به نظر می رسه گرچه ممکنه گوگل شما را سریع تر به نتیجه برسونه.

Advertisements




نمایش صحیح متون فارسی-انگلیسی در جهت چپ به راست

18 04 2010

خوشبختانه اکثر کامپوننت های کنونی از ویژگی راست به چپ متون پشتیبانی می کنند، اما همچنان کامپوننت هایی هستند که این ویژگی را که برای ما حیاتی است پشتیبانی نمی کنند. در چنین مواقعی ممکنه که نیاز داشته باشید که حتما از آن ابزار استفاده کنید، ولی همچنان مشکل متون فارسی همراه با متون انگلیسی را خواهید داشت.

در ادامه با استفاده از کدی که تهیه کردم کاری می کنیم که متونی اینچنینی در حالت چپ به راست هم به درستی نمایش داده بشوند. برای نمونه:

PersianLeftToRightText

اصلاح متن فارسی برای نمایش صحیح در حالت چپ به راست

کاری که این تابع انجام می دهد تغییر و جابجایی محل متون انگلیسی و فارسی هست. توجه کنید که متن تغییر داده شده قابل برگشت نیست و هیچ تابعی برای برگشت آن نوشته نشده، پس سعی کنید آن را در هیچ جایی ذخیره نکنید.

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

دریافت کلاس PersianLeftToRight

ویرایش: همچنین نرم افزاری بر اساس همین کلاس نوشتم تا عمل تبدیل را بر روی فایل متنی انجام بده. این نرم افزار رو هم از اینجا دریافت کنید

دریافت برنامه PersianLeftToRightCorrection

پ.ن1: ممکن است که این کلاس برای برخی کاراکتر ها به درستی کار نکند، در صورت مشاهده این موارد لطفا آنها را گزارش کنید تا بررسی شوند.

پ.ن2: در متون چند خطی ترتیب نمایش به پایین به بالا تغییر پیدا می کند و این به خاطر از آخر به اول شدن متون فارسی هست.

موفق باشید.





چند اشتباه در طراحی پایگاه داده

20 03 2010
Database - سال نو مبارک

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

این مطلب رو هم مدتی قبل که یک پروژه نیمه کاره رو تحویل گرفتم تا کار کنم و از دست مشکلات پروژه ناراحت بودم نوشتم. پست با کمی ویرایش الان آماده شد!

سال نو همه مبارک و خوش و خرم باشید!

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

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

در ادامه می خواهم چند اشتباه در طراحی پایگاه داده رو مطرح کنم، به این امید که دیگر شاهد آنها نباشم. این موارد مطمئنن در طور دوره های آموزی به کرات مطرح می شود ولی شگفتا که هنوز هم عده ای این اشتباه ها را تکرار می کنند.

  • استفاده ازنوع داده های رشته ای به عنوان اندیس یا  کلید اصلی

نوع داده varchar و هر نوع داده کاراکتری یا رشته ای بدترین نوع انتخاب برای اندیس جدول است. این اشتباه زمانی بدتر خواهد شد که این فیلد به عنوان کلید اصلی نیز استفاده کنید؛ و سرانجام اشتباه با استفاده از این کلید به عنوان کلید خارجی تکمیل خواهد شد!

البته توجه داشته باشید که استفاده از فیلد اندیس کاراکتری در کنار کلید اصلی مشکل خاصی نخواهد داشت. فقط این مورد در صروت لزوم و زمانی که از آن فیلد به کرات برای جستجو استفاده میکنید مورد استفاده قرار دهید.

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

راه حل: راه حل بسیار ساده استفاده از انواع داده عددی مانند int یا bigint است. در عین حال می توانید از سایر انواع ساده دیگر نیز استفاده کنید.

  • عدم استفاده از اندیس یا کلید اصلی

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

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

این نکته را هم در نظر داشته باشید که بدون کلید اصلی و یا یک کلید یکتا نمی توانید ارتباطی مابین جداول بر قرار کنید.

  • استفاده از فیلد های NULL بی مورد

همیشه در استفاده از فیلدهای NULL دقت کنید. سعی کنید که فیلدهای رشته ای را NULL قرار ندهید چونکه یک معنای زاید به آن فیلد داده اید، مگر اینکه واقعا به null نیاز داشته باشید. یک کاربرد مفید null بودن فیلد برای کلید های خارجی هست که نشان می دهد، هیچ ارتباطی در رکورد جاری تعریف نشده است. نمونه ای این کاربرد را در تصویر زیر مشاهده می کنید.

Database

در کنار استفاده از فیلدهای null می توانید از مقادیر پیش فرض هم استفاده کنید تا هیچ فیلدی ندانسته خالی رد نشود. این کار کدهای sql شما را هم کوتاه تر خواهد کرد.

در همین زمینه مطالعه کنید:

10 Common Design Mistakes

Ten Common Database Design Mistakes

Database Performance Philosophy





انتقال اطلاعات بین دو کلاس مختلف

28 02 2010

کد کوتاهی که در ادامه خواهید دید، یکی از کاربردهای ویژگی Reflection دات نت رو در برنامه نویسی روزمره نشون میده. کاربرد این کد بسیار ساده است در عین حال می تواند خیلی مفید هم باشد.  با یک مثال نشان خواهم که چقدر می تواند در برنامه نویسی به کمکتون بیاد.

کاری که این کد انجام میده، کپی کردن مقادیر ویژگی های عمومی (public property) هست. به عبارت دقیق تر مقادیر ویزگی های یک شیئ را به مقادیر ویژگهای همنام از شیئ دیگر کپی میکند.

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

مسلما می توانید این کد رو ویرایش کنید تا با نیاز های شما سازگاری بیشتری داشته باشد، اما قبل این کار باید کد را ببینید:

public static void CopyPropertiesValue(object sourceModel, object destModel)
{
    Type sourceType = sourceModel.GetType();
    Type destType = destModel.GetType();

    foreach (PropertyInfo srcProp in sourceType.GetProperties())
    {
        PropertyInfo destProp = destType.GetProperty(srcProp.Name, BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.Public);
        if (destProp!=null)
        {
            try
            {
                destProp.SetValue(destModel, srcProp.GetValue(sourceModel, null), null);
            }
            catch { }
        }
    }
}

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

  • مثالی از کاربرد

شاید با مثال بهتر بتوان به کاربر این تابع پی برد.

ابتدا تعاریف کلاسهای مورد استفاده:

class Person
{
	public int PersonID { get; set; }
	public string PersonName { get; set; }
	public string PersonFamily { get; set; }
}
class Car
{
	public int CarID { get; set; }
	public int PersonID { get; set; }
	public string CarModel { get; set; }
}

/// <summary>
/// کلاسی از ترکیب آن دو کلاس
/// </summary>
class Person_Car
{
	public int CarID { get; set; }
	public int PersonID { get; set; }
	public string CarModel { get; set; }
	public string PersonName { get; set; }
	public string PersonFamily { get; set; }
}

در این نمونه کد مشاهده می کنید که مقادیر را می توانیم از کلاس Person_Car به دو کلاس بعدی انتقال دهیم:

public static void CopyModelTest()
{
	Person person = new Person();
	Car car = new Car();
	Person_Car pCar = new Person_Car()
	{
		CarID = 10,
		PersonID = 1,
		CarModel = "ژیان :=)" ,
		PersonFamily = "خلیل زاده",
		PersonName = "سالار"
	};

	CopyPropertiesValue(pCar, car);

	// کپی به کلاس Person
	CopyPropertiesValue(pCar, person);
}

این تابع خیلی به من کمک کرده، امیدوارم که برای شما هم مفید باشه.





افزایش سرعت مرور صفحات اینترنت با افزونه فایرفکس

10 02 2010

نکته مهم: در صورتی که آشنایی کافی به اینترنت، مرور صفحات اینترنت و نحوه کارکرد صفحات آن ندارید این شیوه برای شما مناسب نیست. برای درک صحیح عملکرد این روش حداقل باید با mime type ها آشنایی داشته باشید.

در این نوشتار قصد دارم که افزونه BetterCache رو معرفی کنم که این بهبود رو با استفاده از این افزونه انجام خواهیم داد.


دریافت افزونه BetterCache

شیوه نصب و راه اندازی با تنظیمات بهینه

پس از نصب، این افزونه به طور خودکار شروع به کار خواهد کرد، اما تنظیمات پیش فرض آن چندان مناسب نیست و نیاز به تغییرات اندکی دارد. برای اعمال تغییر باید به صفحه تنظیمات این افزونه بروید. برای این کار گزینه Add-ons را از منوی Tools فایرفاکس انتخاب کنید. در پنجره Add-ons به برگه Extensions رفته و با انتخاب BetterCache دکمه Options را انتخاب کنید. به برگه Never-cache list بروید. در کادر Mime-type مقدار text/html را وارد کنید و دکمه Add را بزنید.

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

BetterCache Never-cache list

BetterCache Never-cache list

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

قبل از هر چیز باید در مورد caching اطلاع داشته باشید. caching در وب در حقیقت ذخیره کرده محتویات متن، تصویر و غیره برای مدت زمان مشخص شده توسط سایت هست. این کار باعث خواهد شد که در درخواست های بعدی به جای دریافت مجدد اطلاعات از سرور سایت، فایل cache شده در مرورگر استفاده شود که این باعث صرفه جویی های زیادی میشود. معمولا اکثر سایت ها قوانین خاصی رو برای caching محتویات مختلف سایت در نظر می گیرند. این قوانین در طی اولین انتقال محتویات سایت به مرورگر ارسال میشود.

کاری که این افزونه انجام میدهد دقیقا مربوط به قوانین caching است. این افزونه با دستکاری این قوانین فایرفاکس را مجبور به ذخیره و cache کردن محتویات سایت برای مدت زمان بیشتری میکند. این نکته رمز موفقیت این افزونه در افزایش سرعت است.

اما نکته مهم در اینجا به کارگیری صحیح و جلوگیری از کش کردن اطلاعات ضروری توسط این افزونه است. زیرا ممکن که محتویات قدیمی را به جای محتویات جدید مشاهده کنید. (در این صورت راه حل استفاده از کلید F5 است)

چرا text/html رو به لیست چشم پوشی ها اضاف کردیم؟ به این علت که معمولا محتویات اصلی سایتها توسط صفحات عادی یا html انتقال پیدا می کند. پس در صورتی که این صفحات را کش کنیم دیگر به محتویات تازه دسترسی نخواهیم داشت.

چند نکته مهم در هنگام به کارگیری این افزونه

در صورتی که احساس می کنید که محتویات سایت در حال مشاهده قدیمی هست از دکمه reload فایرفاکس استفاده کنید. برای اینکه تمامی محتویات سایت به طور کامل و از ابتدا دریافت شود از ترکیب کلید های ctrl+f5 استفاده کنید.

در تنظیمات پیش فرض این افزونه سایت های ssl دار کش نمی شوند(این سایتها با یک s اضافی مشخص هستند httpS). برای فعال کردن این امکان گزینه Cache secure connections too را از صفحه اصلی تنظیمات این افزونه انتخاب کنید. با این کار شاهد افزایش چشمگیر سرعت gmail خواهید بود. گزینه refresh در gmail هم فراموش نشود.

نکته برای طراحات وبرنامه نویسان وب: برای جلوگیری از ایجاد مشکل در مشاهده صفحات localhost، در لیست Never-cache list مقادیر localhost و 127.0.0.1 رو هم با استفاده از فیلد URL اضافه کنید.

نکته مهم: در صورتی این افزونه به هر دلیلی مانند جلوگیری از نمایش محتویات به روز در سایت های مورد علاقه شما، مشکلاتی را برایتان ایجاد میکند به سادگی میتوان این افزونه را از فایرفاکس حذف کنید.

پ.ن1: انتظار معجزه از این افزونه نداشته باشید. کارایی این افزونه زمانی مشخص تر خواهد بود که از سایتهای مشخصی بارها در طول روز بازدید کنید و یا سایتهایی که تعداد زیادی اسکریپت دارند.

پ.ن2: برای من این افزونه خیلی مفید بود و در مدت یک هفته که دارم ازش استفاده میکنم احساس میکنم که سرعت مرور صفحات بیشتر از گذشته شده.
باشد که لنگر کشتی دیگر نامردی نکند.





سرویس گوگل برای بدست آوردن favicon ها و اعمال آن بر لینک های خارجی

8 02 2010

ظاهرا مدتی هست که گوگل یک سرویس ویژه راه اندازی کرده که علنی نیست، ولی خوب معلوم نیست چه کسی و چطوری متوجه این سرویس شده به نظر میرسه بسیار شبیه به سرویس مورد استفاده در google reader هست. در هر صورت استفاده از این سرویس  رواج پیدا کرده.

این سرویس برای بدست آوردن آیکونهای سایت ها یا همون favicon هست که مزیت های خاصی داره. در حالت عادی برای بدست آوردن آیکون باید به فایل favicon.ico در سایت مورد نظر رفرنس داد. خیلی از مواقع وبمستر ها آیکونی را برای سایت در نظر نمیگیرند و این باعث مشکلاتی در دادن رفرنس مستقیم میشه. که این ما را مجبور به استفاده از روشهای پیچیده تری می کند.

مزیت اصلی این سرویس گوگل در همین زمینه است، یعنی برای سایتهایی که favicon آنها یافت نشد یک آیکون پیش فرض در نظر میگیرد. مزیت دیگر آن png بودن فرمت تصاویر این favicon های برگردانده شده هست که باعث خواهد شد که تقریبا توسط همه مرورگرها قابل شناسایی باشند.

آدرس این سرویس مورد نظرما:

http://www.google.com/s2/favicons?domain=domainName

آیکون پیش فرض این سرویس یک جهان 16 پیکسلی هست که خیلی مناسب برای منظور ماست. البته سرویس مورد استفاده در google reader به این آدرس هست:

http://s2.googleusercontent.com/s2/favicons?domain=domainName&alt=feed

که آیکون پیش فرض آن هم آیکون فید هست. میتونید با حذف &alt=feed آیکون پیش فرض رو به آیکون جهان تغییر بدید.

به جای domainName باید آدرس دامین سایت قرار دهید. برای مثال دامنه برای سایت گوگل google.com خواهد بود و آدرس سرویس آن هم http://www.google.com/s2/favicons?domain=google.com است. که نتیجه این Google Favicon تصویر آیکون گوگل هست که به این طریق بدست آمده.

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

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

افزودن تصویر favicon به لینکهای خارجی با JQuery

اگر در سایتتون از jquery استفاده میکنید، میتوانید از این کد استفاده کنید:

$(document).ready(function() {
	$("a").each(function() {
		var href = $(this).attr("href");
		if (href && href.match(/:\/\//) && !href.match(document.domain)) {
			var domain = href.replace(/^(https?:\/\/[^\/]+).*$/, '$1').split('/')[2];
			var img = "<img src='http://www.google.com/s2/favicons?domain=" + domain + "' style='margin:0px 2px;border:0px;width:13px;height:13px'/>";
			//$(this).prepend(img); // For LTR site
			$(this).append(img); // For RTL site
		}
	})
});

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

در صورتی که از jquery استفاده نمی کنید میتوانید از کد زیر استفاده کنید:

function ApplyFavicons() {
for (i = 0; i < document.links.length; i++) {
	var a = document.links[i];
	var href = a.href;
	if (href && href.match(/:\/\//) && !href.match(document.domain)) {
		var domain = href.replace(/^(https?:\/\/[^\/]+).*$/, '$1').split('/')[2];
		var img = document.createElement("img");
		img.src = "http://www.google.com/s2/favicons?domain=" + domain;
		img.style.border = '0px'; img.style.margin = '0px 2px'; img.style.width = '13px'; img.style.height = '13px';
		a.appendChild(img);
	}
}}

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

توجه کنید که در این دو تابع من اندازه favicon را به 13 پیکسل تغییر دادم. در صورت نیاز می توانید آن را به اندازه پیش فرض یعنی 16 پیکسل تغییر دهید.

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





JavaScript Deobfuscator

30 01 2010

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

استفاده از Obfuscation برای زمانهایی است که مجبور هستید کد برنامه را همراه با برنامه عرضه کنید ولی نمی خواهید که کد خوانا بوده و قابل استفاده باشد. علاوه بر این یکی از مزیت های این کار کاهش حجم کد می باشد. این عمل برای خیلی از زبانها قابل انجام است ولی در این نوشته در مورد JavaScript صحبت میکنم.

فرض کنید که کد Obfuscate شده ای رو دارید. خواندن یا دیباگ کردن چنین کدهایی بسیار مشکل است. در این حالت هست که نیاز به ابزاری وجود خواهد داشت که این کد ها رو برایتان رمزگشایی و خوانا بکند.

در زمینه رمزگشایی کدهای Obfuscate شده چندین وبسایت و حتی یک افزونه برای فایرفاکس وجود دارد. افزونه فایرفاکس با نام JavaScript Deobfuscator بیشتر شبیه یک profiler هست که کد های اجرا شده توسط مرورگر رو شناسایی می کنه و سپس به ترتیب آنها رو رمز گشایی میکنه. شیوه عمل این افزونه اصلا برام جالب نبود ولی با این حال نتیجه بدست امده مطمئن هست.

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

در این آدرس: http://www.gosu.pl/decoder

ابزار بسیار کارآمدی هست با توجه به اینکه کدها رو رنگی هم می کند.

برای روشن تر شدن کاربرد چنین ابزارهایی مثالی رو می زنم. فرض کنید که تابعی مانند زیر برای معاسبه فاکتوریل دارید:

fact = function (fact) {
	var i,result=1;
	for (i = 1; i <= fact; i++) {
		result = result * i;
	}
	return result;
}

این کد رو با استفاده از ابزاری مانند Closure Compiler فشرده می کنیم و نتیجه مانند این خواهد بود:

fact=function(c){var a,b=1;for(a=1;a<=c;a++)b*=a;return b};

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

پس با استفاده از JavaScript Decoder که در بالا لینک داده شده کد مزبور رو رمز گشایی می کنیم:

fact = function (c)
{
    var a, b = 1;
    for (a = 1; a <= c; a++) {
        b *= a;
    }
    return b;
};

همانطور که می بینید، کد رمز گشایی شده همانند کد اولیه نیست ولی خوانایی به مراتب بهتری داره و می توان کاربرد آن رو با زحمت کمتری تشخیص داد.