۱۳۸۹/۰۷/۰۸

برنامه‌ي ++ Notepad و syntax highlighting فايل‌هاي دات نتي


برنامه‌ي ++ Notepad به عنوان يك اديتور رايگان، سبك و بسيار سريع به همراه ارائه‌ي syntax highlighting عالي، يكي از ويرايشگرهاي محبوب برنامه نويس‌ها (در هر گرايش و صنفي) به شمار مي‌رود. اكثر فايل‌هاي مرتبط با دات نت فريم ورك هم منهاي فايل‌هاي سورس‌ها با پسوند cs و vb و امثال آن، دقيقا از نوع XML هستند؛ براي مثال: xaml, config, edmx, csproj و بسياري موارد ديگر. اين پسوندها به صورت پيش فرض در برنامه‌ي ++ Notepad جهت اعمال syntax highlighting تعريف نشده‌اند و براي اضافه كردن آن‌ها كافي است به صورت زير عمل كرد:
به منوي Settings گزينه‌ي Style configurator مراجعه كنيد. سپس در قالبي كه آن‌را انتخاب كرده‌ايد، زبان XML را انتخاب كرده و فيلد User ext را تكميل كنيد (شكل زير):



WPF و قالب‌هايي جهت كنترل DataGrid


در مورد معرفي WPF Extended toolkit چندي قبل مطلبي منتشر شد. در ادامه اين بي مهري‌ها (!) مي‌توان به عدم به روز رساني قالب‌هاي ارائه شده براي WPF اشاره كرد. در WPF4 ، كنترل DataGrid از WPF toolkit به مجموعه‌ي كنترل‌هاي اصلي WPF منتقل شده است، اما قالب‌هاي منتشر شده‌ي آن جهت لحاظ كردن اين مورد به روز نشده‌اند. يعني اگر براي مثال يكي از قالب‌هاي موجود را به برنامه خود اعمال كنيد و سپس DataGrid را بر روي فرم قرار دهيد، وصله‌ي ناهماهنگي را مشاهده خواهيد نمود. اين مشكلات در Silverlight وجود ندارند و قالب‌هاي ارائه شده‌ي براي آن به روز بوده و همچنين روز به روز هم تعدادشان بيشتر مي‌شوند.
اما باز هم نمي‌توان ايراد گرفت چون كار ارائه شده سورس باز است. به عبارتي اگر مايكروسافت اين قالب‌ها را به روز نكرده، خوب، لطفا خود شما وقت بگذاريد و اين كار را انجام داده و سپس يك patch ارائه دهيد. ايرادي دارد؟!
براي اين منظور پروژه‌اي در سايت CodePlex ايجاد شده است و تنها به پوشش دات نت سه و نيم و ديتاگريد متعلق به WPF Toolkit پرداخته است :


اگر علاقمند باشيد كه از ديتاگريد بومي دات نت 4 استفاده كنيد مي‌توانيد از اين patch استفاده كنيد.

۱۳۸۹/۰۷/۰۶

چگونه تشخيص دهيم اسمبلي دات نت ما وصله شده است؟


يكي از روش‌هايي كه براي بررسي يكپارچگي فايل‌ها مورد استفاده قرار مي‌گيرد و عموما در دنياي سخت افزار و firmware هاي نوشته شده براي آن‌ها مرسوم است، قرار دادن CRC32 فايل در قسمتي از فايل و بررسي آن حين Boot سيستم است. اگر CRC32 جديد با CRC32 اصلي يكسان نباشد به اين معنا است كه فايل در حال اجرا پيش تر دستكاري شده است.
اما در دات نت فريم ورك روش متداول اينكار چيست؟ براي اين منظور اضافه كردن امضاي ديجيتال به فايل و اسمبلي نهايي توليدي (فايل exe يا dll توليدي) توصيه مي‌شود (مراجعه به قسمت خواص پروژه و افزودن امضاي ديجيتال جديد فقط با چند كليك، +).
اين مورد خوب است (با توجه به اينكه از الگوريتم‌هاي RSA و SHA1 استفاده مي‌كند)، لازم است، اما كافي نيست زيرا ابزارهاي حذف آن وجود دارند. به عبارتي براي وصله كردن اين فايل‌ها فقط كافي است اين امضاي ديجيتال حذف شود و زماني هم كه نباشد، بررسي خاصي در مورد يكپارچگي فايل صورت نخواهد گرفت.
اما اگر باز هم نگران patch يا وصله شدن اسمبلي دات نت خود هستيد اين مورد افزودن امضاي ديجيتال را حتما انجام دهيد. مهم‌ترين خاصيت آن اين است كه يك سري تابع native در دات نت فريم ورك براي بررسي نبود آن وجود دارند (+):
[DllImport("mscoree.dll", CharSet=CharSet.Unicode)]
public static extern bool StrongNameSignatureVerificationEx(string wszFilePath, bool fForceVerification, ref bool pfWasVerified);

wszFilePath مسير فايلي است كه بايد بررسي شود.
fForceVerification آيا متغير pfWasVerified نيز مقدار دهي گردد؟
خروجي تابع مشخص مي‌سازد كه آيا strong name موجود و معتبر است يا خير؟

و مثالي از استفاده‌ي آن (كه بهتر است در يك تايمر نيم ساعت پس از اجراي برنامه رخ دهد):
using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace SigCheck
{
public class Validation
{
[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
public static extern bool StrongNameSignatureVerificationEx(
string wszFilePath, bool fForceVerification, ref bool pfWasVerified);

public static void SigCheck()
{
var assembly = Assembly.GetExecutingAssembly();
bool pfWasVerified = false;
if (!StrongNameSignatureVerificationEx(assembly.Location, true, ref pfWasVerified))
{
//خاتمه برنامه در صورت عدم وجود امضاي ديجيتال معتبر
throw new Exception();
}
}
}

class Program
{
static void Main(string[] args)
{
Validation.SigCheck();
}
}
}
خوب، شايد پس از حذف و وصله شدن اسمبلي، مجددا strong name به آن اضافه شود! ، آن وقت چه بايد كرد؟
زمانيكه به اسمبلي خود امضاي ديجيتال اضافه مي‌كنيد، هش رمزنگاري شده فايل با الگوريتم RSA ، به همراه public key مورد نياز در اسمبلي ذخيره مي‌شوند. از آنجائيكه private key الگوريتم RSA را منتشر نكرده‌ايد، شكستن الگوريتم RSA كار ساده‌اي نيست، مگر اينكه جفت كليد خودشان را توليد كنند و public key جديد را در فايل نهايي قرار دهند. بديهي است اين public key جديد با كليد عمومي ما كه متناظر است با كليد خصوصي منتشر نشده‌ي اصلي، تطابق نخواهد داشت. براي آشنايي با تابعي كه اين بررسي را انجام مي‌دهد به مقاله ذكر شده رجوع كنيد:



۱۳۸۹/۰۶/۳۰

چه زماني بهتر است از Silverlight استفاده شود؟


1- نياز به توانايي‌هاي موجود در برنامه‌هاي Desktop را داريد اما همچنين نياز است تا آن‌ها را تحت وب نيز ارائه دهيد.
يكي از دلايل اقبال به برنامه‌هاي تحت وب در سازمان‌ها عدم نياز به نصب آن‌ها و توزيع هر چه ساده‌تر اينگونه برنامه‌ها در شبكه است. تنها كافي است چند فايل را بر روي سرور به روز رساني كنيد و پس از آن تمام كلاينت‌ها از آخرين نگارش برنامه شما بهره‌مند خواهند شد (+). توزيع برنامه‌هاي سيلورلايت نيز به همين منوال است. علاوه بر آن استفاده از فناورهايي مانند MEF امكان ماژولار ساختن برنامه و دريافت آخرين ماژول‌هاي تهيه شده (فايل‌هاي XAP مجزاي از برنامه به صورت افزونه) را بر اساس انتخاب و سطح دسترسي كاربر نيز ميسر مي‌سازد.

2- نياز است تا يك برنامه‌ي گرافيكي تمام عيار را تحت وب ارائه دهيد.
توانايي‌هاي XAML به همراه يكي از زبان‌هاي دات نت جهت خلق جلوه‌هاي بصري، پويانمايي و گرافيكي بسيار بسيار فراتر از كتابخانه‌هاي جاوا اسكريپتي موجود هستند و نكته‌ي مهم آن‌ها هم اين است كه لازم نيست حتما يك متخصص مثلا جاوا اسكريپت باشيد تا بتوانيد براي مثال پويانمايي را ارائه دهيد. امكان استفاده از انواع و اقسام قلم‌ها و قرار دادن آن‌ها در برنامه، امكان استفاده از گرافيك برداري و غيره را نيز لحاظ كنيد.

3- برنامه‌ي شما نياز است تا از طريق وب توزيع شود اما نياز به سطح دسترسي بيشتري نسبت به يك برنامه‌ي وب معمولي دارد.
تمام برنامه‌هاي توزيع شده از طريق مرورگرها محدود به سطوح دسترسي آن‌ها نيز هستند. اما امكان نصب خارج از مرورگر برنامه‌هاي سيلورلايت نيز وجود دارد. در اين حالت مي‌توان در صورت نياز و همچنين تائيد صريح كاربر، به سطوح دسترسي بيشتري دست يافت. براي مثال دسترسي به اسكنر در يك برنامه‌ي وب متداول بي‌معنا است. اما سيلورلايت 4 در حالت اجراي در خارج از مرورگر امكان تعامل با اشياء COM را نيز دارد.

4- برنامه‌ي وب شما نياز است تا مدت زمان زيادي فعال باقي بماند.
يك برنامه دريافت ايميل يا يك برنامه مونيتورينگ را در نظر بگيريد. اينگونه برنامه‌ها بايد مرتبا بدون نياز به دخالت كاربر، فعال باقي بمانند و با سرور ارتباط داشته باشند. نوشتن اينگونه برنامه‌ها با HTML و جاوا اسكريپت و فناوري‌هاي مشابه واقعا مشكل بوده و نياز به دانش فني بالايي دارند. اما اين مساله و حيات يك برنامه سيلورلايت تا زمانيكه مرورگر بسته نشده است جزو خواص اوليه اينگونه برنامه‌ها است.

5- از مشكلات مديريت حالت در برنامه‌هاي متداول وب به تنگ آمده‌ايد.
اگر براي مثال برنامه نويس ASP.NET باشيد حتما با مباحث State management آشنايي داريد (از سشن و كوكي گرفته تا ViewState (ايي كه همه به نحوي قصد كوچك كردن آن‌را دارند!) و غيره). تمام اين‌ها هم براي اين است كه بتوان تجربه‌ي كاري برنامه‌هاي دسكتاپ را در محيط مرورگرها شبيه سازي كرد. اين مشكلات در سيلورلايت حل شده است. يك برنامه‌ي سيلورلايت State full است نه Stateless . همچنين اگر از حافظه‌اي هم استفاده مي‌كند اين مورد در سمت كاربر است و نه سمت سرور و نه منقضي شدن زود هنگام سشن‌ها و صدها ترفند براي مقياس پذيري همين مساله‌ي بسيار كوچك با تعداد كاربران بالا در برنامه‌هاي متداول وب.
به عبارتي تصور كنيد كه برنامه‌ي دسكتاپ سال‌هاي قبل شما هم اكنون داخل مرورگر دارد اجرا مي‌شود و چيزي به نام وب سرور وجود ندارد كه پس از نمايش صفحه‌ي وب شما، كليه‌ي اشياء مرتبط با آن‌را در سمت سرور تخريب كند چون بايد پاسخگوي كاربران همزمان بي‌شماري باشد و منابع سرور هم محدود است. (سيلورلايت يك فناوري سمت كاربر است. بنابراين وب سرور صرفا نقش توزيع آن‌را به عهده دارد يا حداكثر ارائه‌ي يك وب سرويس جهت تعاملات بعدي مانند كار با بانك اطلاعاتي)

6- نياز داريد تا برنامه‌ي وب شما تحت تمام مرورگرها به يك شكل به نظر برسد و همچنين رفتار يكساني هم داشته باشد.
هيچ وقت روزي را فراموش نمي‌كنم كه حين پرداخت الكترونيكي بانك XYZ به كمك مرورگر فايرفاكس، دكمه‌ي پرداخت در مرحله‌ي آخر، كار نمي‌كرد! هر چقدر روي آن كليك مي‌كردم اتفاقي نمي‌افتاد! تراكنش برگشت خورد و همين خريد ساده با مرورگر IE به سادگي انجام شد.
با سيلورلايت اين مشكلات را نخواهيد داشت زيرا كار نمايش برنامه شما توسط افزونه‌ي مربوطه صورت مي‌گيرد و اين افزونه مستقل است از نوع مرورگر شما.

7- نياز است برنامه‌ي وب شما در حالت آفلاين هم كار كند.
برنامه‌هاي سيلورلايت تنها زمانيكه نياز به دريافت يا ثبت اطلاعاتي از سرور داشته باشند، بايد آنلاين باشند. همچنين اين برنامه‌ها دسترسي به مفهوم جديدي به نام Isolated Storage دارند كه در آن مي‌توان اطلاعات را به ازاي هر كاربر آن هم با ضريب امنيتي بالا بر روي هارد شخص ذخيره كرد و زمان آنلاين شدن برنامه آن‌ها را به سرور انتقال داد.

8- برنامه وب شما نياز است تا با فايل‌هاي مالتي مديا تعامل داشته و آن‌ها را پخش كند.
حتي تگ Video در HTML5 نيز به پاي توانايي‌هاي مالتي مديا در Silverlight مانند smooth streaming, multicasting, editing, video brushes نمي‌رسد. براي مثال با استفاده از video brushes مي‌توان يك فايل ويديويي در حال پخش را بر روي يك وجه يك شيء در حال پويانمايي نقاشي و نمايش داد.

9- نياز به پشتيباني از multi-touch در برنامه‌ي وب شما وجود دارد.
برخلاف HTML ، تعاملات multi-touch در Silverlight ميسر است.

10- نياز به ايجاد برنامه‌هاي بازي تحت وب داريد.
به طور قطع مي‌توان بازيي‌هايي در حد Pong را با جاوا اسكريپت هم ايجاد كرد، اما اگر نياز به توليد بازي‌هايي جدي‌تر وجود داشت براي مثال انتقال بازي Quake به محيط وب، Silverlight در اين زمينه هم حرف‌هاي زيادي براي گفتن دارد (+).

11- نياز به توليد برنامه‌ي دسكتاپ چند سكويي داريد.
سيلورلايت هم اكنون تحت ويندوز، MAC OS-X ، لينوكس و ... پشتيباني مي‌شود (+). همچنين برنامه‌هاي سيلورلايت قابليت اجراي در خارج از مرورگر را هم دارند.
با سيلورلايت ديگر نيازي نخواهد بود تا كاربران لينوكسي ابتدا Wine را نصب كنند تا بتوانند از يك برنامه‌ي ويندوزي كه انتقال پذير نيست در لينوكس هم بتوانند استفاده كنند؛ چون پروژه‌ي مون لايت لينوكسي براي اين منظور مهيا است.

12- نياز به توليد برنامه‌هاي تحت وب سريع و با كارآيي بالا داريد.
فايل‌هاي نهايي Silverlight با توجه به ماهيت كامپايل شده‌ي آن‌ها به طور قطع از كدهاي جاوا اسكريپتي سمت كلاينت كه بايد توسط مرورگر تفسير و پردازش شوند (و هر كدام هم از موتور خاص خودشان استفاده مي‌كنند)، سريعتر اجرا مي‌شوند (+).

13- از پيچيدگي‌هاي پياده سازي برنامه‌هاي متداول وب خسته شده‌ايد.
هنوز هم با تمام پيشرفت‌هاي حاصل، توليد برنامه‌هاي وب پيشرفته مشكل است. از يك طرف ناسازگاري يك سري از مرورگرها با يك سري از قابليت‌ها را بايد در نظر داشت، تا فراگيري فريم ورك‌هاي Ajax و غيره تا مشكل بودن طراحي كنترل‌هاي جديد فراتر از آن چيزي كه HTML استاندارد ارائه مي‌دهد. بله، به طور قطع دانش فني بالايي در اين زمينه در طي ساليان توليد شده است، اما باز هم فراگيري و تسلط به آن‌ها زمان قابل توجهي را طلب مي‌كند.
در سيلورلايت كليه تعاملات با شبكه به صورت پيش فرض غيرهمزمان است (همان ايده‌ي اصلي Ajax) همچنين با توجه به state full بودن اينگونه برنامه‌ها، عملا برنامه نويس‌ها بدون درگير شدن با مفاهيم اجكسي و مديريت حالت، برنامه‌ي پيشرفته‌ي وبي را در مدت زمان كوتاهي توليد كرده‌اند و اين برنامه در تمام مرورگرهايي كه قابليت بارگذاري افزونه‌ي سيلورلايت را دارند به يك شكل و كيفيت اجرا مي‌شود.

14- در زمينه ميزان مصرف پهناي باند ملاحظاتي ويژه‌اي وجود دارد.
يك برنامه‌ي سيلورلايت تنها يكبار بايد دريافت شود. پس از آن در سمت كاربر كش خواهد شد (تا زمان به روز رساني بعدي برنامه در سرور). همين مساله در دفعات بعدي مراجعه كاربر به سايت نقش قابل توجهي را در كاهش ميزان مصرف پهناي باند (يا به قولي ميزان كمتر data transfer) كلي دارد.

15- فرصت كافي براي فراگيري انبوهي از فناوري‌هاي مختلف را نداريد!
بله! براي ايجاد يك برنامه‌ي تحت وب كه كاربر آن پس از مشاهده بگويد WOW نياز است به HTML ، JS ، CSS ، AJAX ، يكي از فناوري‌هاي سمت سرور و ... مسلط بود (علاوه بر اينكه بايد بدانيد فلان كد JS در IE كار مي‌كند اما در فايرفاكس خير. فايرفاكس فلان قسمت CSS را پشتيباني مي‌كند اما IE خير! و ...).
اما براي استفاده از سيلورلايت فقط كافي است به XAML و يكي از زبان‌هاي دات نت مانند سي شارپ يا VB.NET مسلط باشيد (البته هيچ وقت از دست ASP.NET خلاص نخواهيد شد! حداقل در حد راه اندازي يك وب سرويس يا مفاهيم امنيتي آن).
اين مورد خصوصا براي افرادي كه برنامه نويس دسكتاپ هستند اما علاقمندند تا برنامه‌ي وب نيز توليد كنند بسيار مهم است. با حداقل آموزش مي‌توانند توانايي‌هاي خود را به وب نيز گسترش دهند. علاوه بر آن عمده‌ي دانش Silverlight شما جهت توليد برنامه‌هاي WPF (با توجه به اينكه Silverlight فرزند WPF محسوب مي‌شود) يا Windows phone 7‌ و غيره نيز مي‌تواند بكار گرفته شود.

16- نياز به اجراي كدهاي چند ريسماني در سمت كاربر داريد.
تا اين لحظه پشتيباني رسمي از مباحث چند ريسماني در JavaScript و استانداردهاي مرتبط با آن وجود ندارد. Silverlight به اكثر امكانات Threading موجود در دات نت فريم ورك دسترسي داشته و دانش فعلي شما قابل انتقال است.


و دست آخر بايد به نكته اشاره كرد كه هدف از Silverlight ساخت وب سايت معمولي نيست. اين نوع كارها را با همان ابزارهاي متداول انجام دهيد. هدف اصلي آن ساخت برنامه است (Application در مقابل Web site). مشتري‌هاي اصلي اين نوع برنامه‌ها هم بيشتر سازمان‌ها و اينترانت‌هاي پر سرعت و بسته‌ي آن‌ها هستند كه نه نگران حجم افزونه‌ي سيلورلايت هستند و نه مشكلي با حجم برنامه‌ي سيلورلايت شما در يك شبكه‌ي داخلي پر سرعت دارند.

۱۳۸۹/۰۶/۲۹

نكته‌اي مهم در طراحي قالب‌ برنامه‌هاي Silverlight


قالب سيلورلايتي را ايجاد كرده بودم و IE در حالت نمايش عادي اين قالب 30 درصد CPU Usage ثابت داشت. علت را هم متوجه نمي‌شدم؛ چون در اين حالت اصلا كدي وجود نداشت كه بخواهد CPU Usage ايي را ايجاد كند. يك سري كد XAML جهت نمايش قالب در كنار هم قرار گرفته بودند و همين.
تا اينكه ديروز در وبلاگ رسمي مرتبط با كارآيي برنامه‌هاي Silverlight مطلبي منتشر شد كه دقيقا مشكل طراحي قالب من هم همان بود:

خلاصه آن:
اگر در حالت نمايش برنامه Silverlight شما (بدون اينكه كدي در حال اجرا باشد) به صورت ثابت CPU Usage بالايي را مشاهده مي‌كنيد، پارامتر enableRedrawRegions تگ بارگذاري افزونه‌ي Silverlight را به true مقدار دهي كنيد.
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
...
<param name="enableRedrawRegions" value="true"/>
...
</object>

پس از فعال سازي اين گزينه، برنامه را اجرا كنيد. نواحي را كه مرتبا در حال ترسيم مجدد هستند، با رنگ‌هاي آبي، زرد و صورتي مشاهده خواهيد كرد.
در اين حالت اگر ناحيه‌اي مرتبا در حال به روز رساني مشاهده گرديد، دقيقا همين ناحيه است كه سبب CPU Usage بالا و ثابت برنامه شما شده است و بايد فكري به حال آن كرد.

چه زماني ممكن است اين حالت (ترسيم‌هاي مجدد بدون پايان) رخ دهد؟
عموما اين مشكل در حين استفاده ناصحيح از افكت‌هاي پيش فرض Silverlight مانند DropShadowEffect رخ مي‌دهد. براي مثال مي‌خواهيد قسمتي از قالب شما سايه دار باشد اما نحوه‌ي اعمال اين سايه بسيار مهم است.
        <Border CornerRadius="3">
<!--High cpu usage-->
<Border.Effect>
<DropShadowEffect BlurRadius="7" Color="#FF1E2224" Opacity="3" ShadowDepth="6" Direction="200" />
</Border.Effect>
<StackPanel>
...
...

در اين مثال ابتدا يك border تعريف شده و سپس سايه‌اي به آن اعمال گرديده است. سپس داخل اين Border يك StackPanel قرار گرفته است به همراه يك سري از اشياء زير مجموعه آن. اين كار غلط است! همين مورد به ظاهر ساده 30 درصد CPU Usage ثابت را در برنامه ايجاد كرده بود.

علت چيست؟
با اين نحوه‌‌ي تعريف اشتباه DropShadowEffect ، هر نوع تغيير بصري در مجموعه‌ي Border و StackPanel داخل آن، سبب ترسيم مجدد كل ناحيه مي‌گردد. اين تغيير بصري حتي مي‌تواند شامل چشمك زدن يك cursor درون يك TextBox در قسمتي از اين ناحيه نيز باشد كه با استفاده از ويژگي enableRedrawRegions ، اين مورد را به خوبي مي‌توان مشاهده نمود.

راه حل اين مساله كدام است؟
از دو Border استفاده كنيد. يك Border با ضخامت كم تنها براي نمايش سايه (كه داراي هيچ نوع شيء فرزندي نيست) و Border و StackPanel قبلي هم به همان صورت ابتدايي (البته با حذف DropShadowEffect از آن) باقي بماند.

۱۳۸۹/۰۶/۲۷

باگ امنيتي در ASP.NET و نحوه‌ي رفع آن


بعد از مدت‌ها بالاخره يك باگ امنيتي در ASP.NET كشف شده! البته اين "بعد از مدت‌هايي" كه عنوان شد بر اساس آمار است كه در سايت بي‌طرف Secunia قابل بررسي و مشاهده است (و اگر از يك سري كامپوننت و برنامه‌هاي جانبي ساير برنامه نويس‌ها صرفنظر كنيم، انصافا ضريب امنيتي بالايي را ارائه داده):

البته اين مورد جديد هم مرتبط با خود ASP.NET نيست؛ بلكه مرتبط است با نحوه‌ي پياده سازي الگوريتم AES در دات نت فريم ورك (Padding Oracle / AES cookie encryption vulnerability).
توضيحات بيشتر در سايت Scottgu


خلاصه اين توضيحات:
همانطور كه هزاران بار به برنامه نويسان ASP.NET (و SharePoint) گوشزد شده است، لطفا صفحه‌ي نمايش خطاهاي سفارشي سايت را (customErrors) در web.config برنامه on كنيد. اين خطاي امنيتي موجود در پياده سازي الگوريتم AES نياز به سعي و خطاهاي زياد روي سايت و بررسي پاسخ‌هاي داده شده يا ريزخطاهاي منتشر شده دارد. اگر صفحه‌ي خطاي سفارشي سايت شما تنظيم شده و روشن است، خطري سايت شما را تهديد نمي‌كند؛ زيرا شخص مهاجم هيچ خروجي خطايي را جهت بررسي مشاهده نخواهد كرد.


به روز رساني كتاب Threading in CS


آقاي Albahari (نويسنده برنامه معروف LINQPad) كتاب رايگان خودشون رو در مورد برنامه نويسي چند ريسماني در سي شارپ به روز كرده‌اند كه از آدرس ذيل قابل دريافت است. اين به روز رساني‌ها شامل مباحث اضافه شده در دات نت 4 مانند tasks و غيره كه از مزاياي پردازش موازي بهره مي‌برند نيز مي‌شوند.





۱۳۸۹/۰۶/۲۵

كنترل DatePicker شمسي مخصوص Silverlight 4


Silverlight 4 تاريخ شمسي را از دات نت فريم ورك به ارث نبرده است (+). اما اضافه كردن آن كار خاصي نيست. مجموعه‌ي سورس باز Silverlight toolkit هم داراي DatePicker تاريخ ميلادي است اما به دلايلي كه عرض شد، تاريخ شمسي را پشتيباني نمي‌كند.

كارهايي كه توسط ساير برنامه نويس‌هاي ايراني تابحال در اين مورد انجام شده است:
- اضافه كردن DatePicker فارسي به مجموعه‌ي Silverlight toolkit : (+)
به دو دليل من از اين راه حل استفاده نخواهم كرد:
الف) patch ارائه شده هنوز با Silverlight toolkit يكپارچه نشده است و هربار بايد اين تغييرات را اعمال كرد و غيره ...
ب) شايد من اصلا نخواهم كه از Silverlight toolkit استفاده كنم. آن وقت چه بايد كرد؟
اين تنها كاري است كه جهت Silverlight انجام شده است.

دو نمونه‌ي خوب ديگر هم براي WPF موجود است كه تبديل آن‌ها به Silverlight كار ساده‌اي نيست (چون Silverlight تمام كلاس‌هاي WPF را نيز به ارث نبرده است):
- Farsi Library - Working with Dates, Calendars, and DatePickers
- PersianDate and some WPF controls for it

به همين جهت يك كنترل DatePicker و تقويم شمسي مستقل را براي Silverlight 4 آماده كرده‌ام كه از آدرس ذيل قابل دريافت است:





نحوه استفاده:
الف) ارجاعي را به اسمبلي SilverlightPersianDatePicker.dll به پروژه خود اضافه كنيد. اگر مباحث library caching هم براي شما مهم است، فايل SilverlightPersianDatePicker.extmap.xml پيوست شده را نيز فراموش نكنيد.
ب) xmlns آن بايد به XAML جاري اضافه شود؛ براي مثال:
xmlns:dp="clr-namespace:SilverlightPersianDatePicker.Views;assembly=SilverlightPersianDatePicker"
ج) سپس استفاده از آن به سادگي يك سطر زير خواهد بود:
<dp:PDatePicker x:Name="txtDate" TextBoxWidth="100"  Margin="5"  />

خاصيت SelectedDate آن تاريخ ميلادي و خاصيت SelectedPersianDate آن تاريخ شمسي را بر مي‌گرداند.


كتابخانه‌هاي كمكي كه در حين توسعه‌ي آن استفاده شدند:
كلاس تقويم شمسي اميد خندان راد (كه براي روزهاي دات نت 1 تهيه شده بود).
پنل UniformGrid كه در Silverlight موجود نيست.(+)
رفتار StaysOpen مرتبط با Popup كه در Silverlight از WPF به ارث نرسيده است.(+)
استفاده از كلاس DelegateCommand جان پاپا (براي سهولت Commanding در الگوي MVVM). (+)


۱۳۸۹/۰۶/۲۲

مديريت رخدادهاي MouseLeftButtonDown و MouseLeftButtonUp در Silverlight


نياز بود تا بتوان رخدادهاي MouseLeftButtonDown و MouseLeftButtonUp يك TextBox را در Silverlight مديريت كرد. شايد عنوان كنيد كه خيلي ساده است! دو روال رخداد گردان مربوطه را اضافه كنيد و سپس تعاريف آن‌ها را در كدهاي XAML خود قيد نمائيد. اما واقعيت اين است كه كار نمي‌كند! نه؛ كار نمي‌كند! :)

مشكل از كجاست؟ پاسخي كه در MSDN در اين مورد آمده است به صورت زير مي‌باشد:

"Certain control classes (for example Button) provide control-specific handling for mouse events such as MouseLeftButtonDown. The control-specific handling typically involves handling the event at a class level rather than at the instance level, and marking the MouseLeftButtonDown event data's Handled value as true such that the event cannot be handled by instances of the control class, nor by other objects anywhere further along the event route. In the case of Button, the class design does this so that the Click event can be raised instead."


به عبارتي رخداد Click زحمت كشيده و رخدادهاي MouseLeftButtonDown و MouseLeftButtonUp را نيز handled معرفي مي‌كند و ديگر روال رخدادگردان شما فراخواني نخواهد شد (در WPF هم به همين صورت است) و موارد ذكر شده در visual tree يك TextBox منتشر نمي‌گردند.

راه حل چيست؟

حداقل دو راه حل وجود دارد:
الف) يك كنترل TextBox سفارشي را از كنترل TextBox اصلي بايد به ارث برد و رخدادهايي را كه توسط رخداد Click به صورت handled معرفي شده‌اند، unhandled كرد:

public class MyTextBox : TextBox
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
e.Handled = false;
}

protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
e.Handled = false;
}
}

ب) يا امكان گوش فرا دادن به رخدادهاي handled نيز ميسر است. فقط كافي است اين گوش فرادهنده را توسط متد AddHandler كه پارامتر آخر آن به true تنظيم شده است (رخدادهاي handled نيز لحاظ شوند)، معرفي كرد:

public MainPage()
{
InitializeComponent();
txt1.AddHandler(FrameworkElement.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(txt1_MouseLeftButtonDown), true);
}
private void txt1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

//do something
}

۱۳۸۹/۰۶/۲۰

معرفي WPF Extended toolkit


يكي از نكات جالبي كه در مورد Silverlight وجود دارد اين است كه هر چند تنها قسمتي از WPF را به ارث برده (براي اينكه حجم افزونه‌ي آن قابل قبول باشد)، اما بيشتر از خود WPF مورد توجه مايكروسافت است! شايد يك دليل آن استفاده از Silverlight در Windows phone 7 باشد. به عبارتي اگر برنامه نويس Silverlight هستيد، هم اكنون برنامه نويس Windows phone 7 نيز مي‌باشيد.
اين توجه بيشتر در Silverlight toolkit كاملا مشخص است. Silverlight toolkit از يك سري ابزار و كامپوننت براي توسعه‌ي ساده‌تر برنامه‌هاي Silverlight به صورت سورس باز و تهيه شده توسط مايكروسافت، تشكيل شده است. حجم WPF toolkit كه آن هم توسط مايكروسافت به صورت سورس باز ارائه و به روز مي‌شود حدود 2 مگابايت است؛ اما حجم Silverlight toolkit حدود 18 مگابايت مي‌باشد! بسياري از كنترل‌ها و امكانات Silverlight toolkit را در WPF نمي‌توانيد پيدا كنيد مانند BusyIndicator ، ChildWindow ، DataForm و غيره. نمونه‌ي ديگر اين توجه WCF RIA Services است. هدفگيري اصلي اين مورد نيز Silverlight است و نه WPF (كه از آن در Visual studio LightSwitch هم استفاده كرده‌اند).
اخيرا يك گروه خيّر كار تبديل و انتقال كنترل‌هاي Silverlight toolkit به WPF toolkit را شروع كرده است كه حاصل آن از آدرس ذيل قابل دريافت است: (اين هم يكي از مزيت‌هاي پروژه‌هاي سورس باز است)



۱۳۸۹/۰۶/۱۵

فيد اشتراك‌هاي من در گوگل ريدر

مدتي ليست مطالب مورد علاقه را به شكل هفتگي در اين سايت ارائه دادم (تازه‌هاي هفته ...)، سپس تبديل شد به ارائه‌ي همان‌ها در سايت‌هاي به اشتراك گذاري لينك و الان هم به نظر من بهترين روش، استفاده از گزينه‌ي Share در گوگل ريدر است. به اين صورت يك فيد خودكار از موارد به اشتراك گذاشته شده را مي‌توان تهيه كرد:


۱۳۸۹/۰۶/۱۲

به روز رساني‌هاي مهم هفته دوم شهريور 89


  • نسخه‌ي جديد برنامه Resharper ارائه شده به همراه بهبودهايي در كارآيي آن.
ليست موارد برطرف شده : +
دريافت : +

  • به روز رساني‌هايي هم در مورد سيلورلايت 4 ارائه شده و اگر آپديت ويندوز شما روشن بوده باشد، حتما حداقل runtime آن‌را به صورت خودكار دريافت كرده‌ايد و از آنجائيكه visual studio LightSwitch هم مبتني بر سيلورلايت 4 و WCF RIA Services است؛ اين به روز رساني‌ها شامل حال اين برنامه نيز مي‌گردد.

دريافت SDK جديد: +
دريافت Runtime جديد: +
توضيحات بيشتر در مورد موارد فيكس شده: +