۱۳۸۸/۰۱/۱۱

قالبي براي ايجاد آزمون‌هاي NUnit مخصوص ReSharper


افزونه‌ي ReSharper به‌دليل يكپارچه كردن امكان استفاده از NUnit در ويژوال استوديو، يكي از انتخاب‌هاي اول جهت انجام آزمايشات واحد در اين محيط به شمار مي‌رود.
اخيرا آقاي Genisio چند قالب ايجاد آزمون‌هاي NUnit را مخصوص ReSharper ايجاد كرده‌اند، كه در ادامه در مورد نحوه‌ي استفاده از آن‌ها توضيح داده خواهد شد.
پس از دريافت فايل‌ها، براي استفاده، به منوي ReSharper گزينه‌ي live templates مراجعه نمائيد. سپس بر روي نوار ابزار صفحه‌ي باز شده، روي دكمه‌ي import كليك نموده و فايل‌ها را معرفي كنيد.
NewTestFileTemplate.xml از نوع file template است.
TestTemplates.xml از نوع live template مي‌باشد.


اكنون مجددا به منوي اصلي ReSharper مراجعه كنيد و مسير زير را طي نمائيد:

ReSharper -> new from template -> more …




گزينه‌ي Test اضافه شده را انتخاب كرده و سپس قسمت Add to quicklist را نيز انتخاب نمائيد.
به اين صورت گزينه‌ي Test به اين منو افزوده خواهد شد و هر بار كه بر روي آن كليك شود، يك كلاس حاضر و آماده مطابق قالب اصلي يك كلاس استاندارد NUnit براي شما ايجاد خواهد شد.
همچنين در اين مجموعه يك سري live template نيز موجود است كه كار آن‌ها فعال سازي intellisense ويژوال استوديو جهت ايجاد يك سري متدها به صورت خودكار است. براي مثال اگر كلمه‌ي test را تايپ كنيد و سپس دكمه‌ي tab و يا enter را فشار دهيد، بلافاصله بدنه‌ي خالي يك متد تست براي شما ايجاد خواهد شد.
ساير ميان‌بر‌هاي در نظر گرفته شده، به شرح زير هستند:
test – Create a new [Test] method
setup – Create a [SetUp] method
teardown – Create a new [TearDown] method
ise – Assert that condition is equal to value
ist – Assert that condition is true
isf – Assert that condition is false
isn – Assert that condition is null
isnn – Assert that condition is not null


۱۳۸۸/۰۱/۱۰

حذف سريع تمام ركوردها در SQL server


فرض كنيد يك ديتابيس آزمايشي داريد كه مي‌خواهيد تمام ركوردهاي آن‌را حذف كنيد. اگر در اين ديتابيس انواع و اقسام كليدهاي خارجي و تريگر و امثال آن وجود داشته باشند، صرفا با يك دستور delete ساده كار به پايان نمي‌رسد و موفق به حذف ركوردها نخواهيد شد (چون اين قيد و بندها به همين جهت طراحي شده‌اند تا يكپارچگي ديتابيس حفظ شود).
اما اگر واقعا اين قيود در اين لحظه مهم نبودند و نياز بود تا تمام ركوردها را حذف كنيم، سريعترين راه حل موجود چيست؟

--Disable Constraints & Triggers
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL'
--Perform delete operation on all table for cleanup
exec sp_MSforeachtable 'DELETE ?'
--Enable Constraints & Triggers again
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL'
--Reset Identity on tables with identity column
exec sp_MSforeachtable 'IF OBJECTPROPERTY(OBJECT_ID(''?''), ''TableHasIdentity'') = 1 BEGIN DBCC CHECKIDENT (''?'',RESEED,0) END'

اسكريپت فوق تمامي ركوردهاي ديتابيس جاري را حذف كرده و همچنين فيلدهاي identity را نيز مجددا به حالت اول باز مي‌گرداند.

توضيحات:
sp_Msforeachtable يكي از رويه‌هاي ذخيره شده‌ي سيستمي اس كيوال سرور مي‌باشد كه مستند نشده است. اگر نياز داشتيد كدي را بدون نوشتن يك كرسر و امثال آن، بر روي تمامي جداول اجرا كنيد مي‌توان از آن استفاده نمود.
امضاي اين رويه ذخيره شده به صورت زير است:

exec @RETURN_VALUE=sp_MSforeachtable @command1, @replacechar, @command2,
@command3, @whereand, @precommand, @postcommand

كه در آن:
RETURN_VALUE مقدار بازگشتي است.
Command1 اولين دستوري است كه اجرا خواهد شد (به همين ترتيب سپس Command2 و بعد از آن Command3 اجرا خواهد گرديد)
Replacechar كاراكتري است كه در دستور T-SQL مورد نظر جايگزين نام جدول خواهد شد. مقدار پيش فرض آن ? است.
Precommand پيش از پردازش عمليات روي هر جدولي اجرا مي‌شود.
Postcommand پس از اجراي كليه دستورات روي تمامي جداول، اجرا خواهد شد.

چند مثال:
نمايش تمامي جداول ديتابيس جاري
EXEC sp_MSforeachtable "print '?'"
نمايش اندازه‌ي جداول يك ديتابيس
EXEC sp_msforeachtable 'sp_spaceused ''?'''

۱۳۸۸/۰۱/۰۹

افزونه‌ي امنيتي كازابلانكا براي Fiddler


Fiddler ابزاري است كه به صورت يك پروكسي عمل مي‌كند و تمام اطلاعات ارسالي و دريافتي از طريق مرورگر وب شما را مي‌تواند مونيتور نموده و اطلاعات لازم را به شما ارائه دهد.
براي مثال IE8 ارائه شده و مطابق بررسي‌ها سرعت بارگذاري صفحات در آن اگر كمتر از فايرفاكس نباشد، حداقل برابر يا كمي بيشتر است يا حداقل سرعت آن دوبرابر IE7 گزارش شده. حال شايد اين سؤال پيش بيايد كه اين اندازه گيري‌ها كه گاهي در حد ميلي ثانيه است چگونه صورت مي‌گيرد؟ از چه ابزاري براي اين‌كار استفاده مي‌كنند؟
يكي از ابزارهاي دقيق انجام اينكار استفاده از Fiddler است (شكل زير).



اين برنامه مستقل از مرورگر عمل مي‌كند و براي مثال تنظيمات پروكسي فايرفاكس براي استفاده از آن در اين صفحه توضيح داده شده است.

اخيرا افزونه‌اي سورس باز براي اين برنامه تحت عنوان Casaba Security Watcher ارائه شده است كه از آدرس زير قابل دريافت است:

براي نصب آن، دو فايل dll آن‌را كه اسمبلي‌هاي دات نتي هستند، به درون فولدر scripts برنامه فيدلر كپي كرده و سپس برنامه را اجرا كنيد. يك tab جديد به فيدلر تحت عنوان security auditor اضافه مي‌شود كه كار آن بررسي محتواي رد و بدل شده و گوشزد كردن موارد امنيتي مرتبط است:



قالب‌هاي جديد SharePoint


10 قالب جديد براي شيرپوينت توسط مايكروسافت ارائه شده است كه از آدرس زير قابل دريافت هستند:




براي نصب ساده‌ي آن‌ها مي‌توان از WSP زير استفاده كرد:
SharePoint Themes WSP


۱۳۸۸/۰۱/۰۸

Composite WPF and Silverlight

معرفي سايت ExtensionMethod.NET


سايت ExtensionMethod.NET بانك اطلاعاتي است از قابليتي تحت عنوان extension methods معرفي شده در C# 3.0 و Visual Basic 2008 . هدف اصلي از extension methods ، بسط كلاس‌هاي دات نت فريم ورك توسط جامعه‌ي برنامه نويس‌ها مي‌باشد.



مثلا در كلاس پايه string ، متدي به نام Right وجود ندارد. براي اضافه كردن آن مي‌توان به صورت زير عمل كرد:

public static string Right(this string s, int length)
{
length = Math.Max(length, 0);
if (s.Length > length)
{
return s.Substring(s.Length - length, length);
}
else
{
return s;
}
}

و پس از آن هم استفاده از اين متد كه كلاس پايه string را بسط داده است به شكل زير خواهد بود (همانند يكي از متدهاي كلاس string مي‌توان از آن استفاده كرد):
string s = "abcde";
s = s.Right(3); //s becomes "cde"

براي پيگيري سايت هم مي‌توان از فيد آن استفاده نمود.

۱۳۸۸/۰۱/۰۷

آشنايي با كلاس JavaScriptSerializer


براي استفاده از jQuery Ajax يكي از روش‌هاي ارسال ديتا به برنامه، تبديل داده‌ها به فرمت JSON مي‌باشد. براي داده‌هاي ساده، تشخيص اين فرمت ساده است. مثلا اگر امضاي تابع وب سرويس اجكس ما به صورت زير باشد:
public static bool IsUserAvailable(string username)
اطلاعات جي‌سوني را كه قرار است ارسال كنيم، فرمت زير را بايد داشته باشد:
{'username':'value'}
حال اگر آرگومان‌هاي ما پيچيده‌تر بودند چطور؟ مثلا بجاي يك رشته ساده، يك ليست جنريك داشتيم، فرمت ورودي را چگونه بايد تشخيص داد؟
براي اين منظور در دات نت 3 و نيم، كلاسي جهت انجام اينگونه تبديلات پيش بيني شده است كه شرح مختصر آن به صورت زير است:
ابتدا بايد ارجاعي را به اسمبلي system.web.extensions به برنامه افزود و سپس جهت سهولت كار مي‌توان يك extension method از كلاس JavaScriptSerializer مهيا در فضاي نام System.Web.Script.Serialization ايجاد كرد:

public static string ToJson(this object data)
{
return new JavaScriptSerializer().Serialize(data);
}
اكنون چند مثال زير را در نظر بگيريد:
        public static string GetJsonTest0()
{
var data = "a1";
return data.ToJson();
}

public static string GetJsonTest1()
{
var data = new List<string> { "a1", "a2", "a3" };
return data.ToJson();
}

public static string GetJsonTest2()
{

var lst =
new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>("Name", "علي"),
new KeyValuePair<string, object>("Number", 10),
new KeyValuePair<string, object>("Desc", "منابع مورد نياز")
};

return lst.ToJson();

}
خروجي‌هاي آن‌ها به ترتيب به صورت زير خواهند بود:

"a1"
["a1","a2","a3"]
[{"Key":"Name","Value":"علي"},{"Key":"Number","Value":10},{"Key":"Desc","Value":"منابع مورد نياز"}]

اين كلاس همچنين قابليت Deserialize و تبديل داده‌هايي به فرمت JSON به اشياء مورد نظر ما را نيز دارا است.

ايجاد رنگ و روي سفارشي براي اديتور Visual Studio


برنامه‌ي آنلايني جهت توليد يك theme سفارشي جديد براي ويژوال استوديو ايجاد شده است كه در آدرس زير قابل استفاده است:


ابتدا تنظيمات رنگ خود را انتخاب كنيد، سپس بر روي دكمه refresh كليك نمائيد تا نمونه‌اي از نتيجه‌ي كار را بتوان مشاهده كرد و سپس بر روي دكمه create كليك كنيد.


و براي استفاده از فايل توليد شده از طريق منوي tools گزينه‌ي Import and Export Settings اقدام كنيد.


۱۳۸۸/۰۱/۰۶

پيش بيني وضعيت دنياي برنامه نويسي در 5 سال آينده


در 5 سال آينده مواردي كه در ادمه برشمرده خواهند شد، نقش بسيار مهمي را در دنياي برنامه نويسي و جهت گيري‌هاي آن ايفا خواهند كرد (براي مثال اگر براي شما اين سؤال مطرح است كه هدف از WCF ، REST services ، سيلورلايت 3 و غيره چيست، اين مقاله‌ي كوتاه را مطالعه نمائيد) :

الف) Object Relational Mapping
ORM يكي از بازيگرهاي واضح خواهد بود. خصوصا پروژه‌اي مانند Fluent NHibernate با ويژگي‌هاي زير:
  • سابقه‌اي 10 ساله (قسمت عمده‌اي از اين سابقه به دنياي جاوا بر مي‌گردد)
  • امكان استفاده از انواع و اقسام ديتابيس‌ها توسط آن
  • پشتيباني از Linq
  • و ...

ب) نرم افزار به عنوان سرويس ( Software as a Service يا SaaS )
نرم افزار به عنوان سرويس يك مفهوم تجاري است كه در آن مصرف كننده بر اساس نيازهايش هزينه‌ي يك نرم افزار را خواهد پرداخت. بر اين اساس برنامه نويسي در زمينه‌هاي طراحي و مديريت دست خوش تغييرات عمده‌اي مي‌شود. شايد نيازي به ذكر نباشد كه حتي مايكروسافت نيز در حال برنامه ريزي براي اين نوع از توسعه است.
پرداختن به SaaS نيازمند يك سري از ويژگي‌ها است:
  • سادگي توسعه و دستيابي: در اين مدل تجاري، استفاده و دسترسي به نرم افزار مورد نظر بايد بسيار ساده باشد. بر اين اساس برنامه‌هاي تحت وب، يا برنامه‌هاي هاست شده توسط مرورگرها (مانند سيلورلايت) محبوبيت بيش از پيشي را خواهند يافت.
  • قابليت تنظيم و ماژولار بودن برنامه‌ها: در اين مدل نياز است تا كاربر تنها هزينه‌ي ماژول‌هايي را بپردازد كه به آن‌ها نياز دارد و اين امر سبب بازنگري در طراحي و توسعه‌ي برنامه‌هاي موجود خواهد شد.
  • نياز به زير ساخت بهينه و سريعي خواهد بود: از آنجائيكه كاربران بسيار ساده مي‌توانند از يك برنامه به برنامه و شركتي ديگر رجوع كنند، براي بقا بايد جنگيد! نياز به زير ساخت‌هايي وجود خواهد داشت كه توسط آن‌ها بتوان نيازهاي كاربران را در حداقل زمان ممكن برآورده كرد و اين موارد نياز به آموختن يكي از فريم ورك‌هاي مطرح موجود را خواهد داشت به همراه آموختن مباحث مديريت پروژه، آشنايي با آزمون‌هاي واحد، كنترل كيفيت ، يكپارچگي مداوم و امثال آن.

ج) پردازش ابري
پردازش ابري شبيه به آن‌چيزي كه مايكروسافت Azure ارائه مي‌دهد، نيز يكي از نتايج مفهوم تجاري SaaS است. تمركز پردازش ابري بر روي ارائه‌ي وب سرورها، مكان‌هاي ذخيره داده و امثال آن است. به اين صورت شما ديگر درگير تهيه و پرداخت هزينه جهت راه اندازي ديتاسنتر ويژه‌ي خود نخواهيد شد و بسياري از هزينه‌هاي شما كاهش خواهند يافت. بهره برداري تجاري گسترده از اين روش با توجه به توسعه‌ي فريم ورك‌هاي ويژه‌ي اين نوع پردازش‌ها، آموزش و غيره ، بين سال‌هاي 2010 و 2015 شروع خواهد شد.

د) اجراي موازي
پردازش ابري اثرات خاص خودش را بر روي دنياي نرم افزار و برنامه نويسي خواهد گذاشت. اين طبيعت توزيع شده سبب خواهد شد كه در آينده از برنامه نويسي‌هاي چند ريسماني و مسايل همزماني حاصل از آن‌ها بيشتر بشنويد و نهايتا معماري برنامه‌ها به سمت استفاده از روش‌هاي زير سوق خواهند يافت:
REST services;
Message-based distributed architectures, i.e.: see NServiceBus, Mass Transit or Rhino Service Bus



ه) برنامه‌هاي غني وب يا Rich Internet Applications
Rich Internet Applications يا RIA نقش مهمي را در SaaS بازي خواهند كرد و هدفگيري مايكروسافت در اين باره ارائه Silverlight 3.0‌ و Microsoft .NET RIA Services است. هر چند اين موارد راه طولاني (يكي دو ساله) را در پيش خواهند داشت تا به حد استانداردهاي لازم برسند اما حركت‌هاي مهمي در اين زمينه به شمار مي‌روند.

برداشتي آزاد از Development in 5 Years Would be Affected by

Notepad++ 5.3


Notepad++ برنامه‌ي رايگاني است براي ويرايش كدها با قابليت syntax highlighting بسيار عالي و درخور توجه به همراه يك دو جين افزونه كه قابليت‌هاي آن‌را افزايش مي‌دهند.

قبل از اين برنامه، از ultra-edit براي ويرايش‌هاي "دم دستي" استفاده مي‌كردم و اگر قابليت‌هاي اين دو را مقايسه كنيم، پس از نصب افزونه‌هاي NP++ ، اين برنامه چيزي كمتر از برنامه‌ي غير رايگان ultra-edit نخواهد داشت.

افزونه‌ي SVN براي NP++

۱۳۸۸/۰۱/۰۵

Ankh-SVN-2.0.6347


Ankh-SVN افزونه‌ي رايگاني جهت كار با SVN‌ درون VS.Net است. برخلاف VisualSVN كه تنها محصور كننده‌ي توانايي‌هاي TortoiseSVN است (و رايگان هم نيست)، اين افزونه‌ تمام موارد كار با SVN را از صفر بازنويسي كرده و يك افزونه‌ي مستقل و متكي به خود است.

Building WCF REST Services


ويديوي رايگاني در مورد پياده سازي WCF Services با استفاده از اصول REST ، ويژگي‌هاي WebGet و WebInvoke، كار با كلاس‌هاي SyndicationFeed و Rss20FeedFormatter و هاست آن در IIS .

ماخذ


StyleCop 4.3.1.3


به روز رساني جديد StyleCop و يا همان ابزار استاندارد سازي و يكنواخت كردن ظاهر كدهاي نوشته شده كه پيشتر در تيم‌هاي داخلي مايكروسافت مورد استفاده قرار مي‌گرفت، از آدرس زير قابل دريافت است.

همچنين نگارش جديد StyleCop for ReSharper را نيز مي‌توانيد از آدرس زير دريافت نمائيد.

۱۳۸۸/۰۱/۰۴

معرفي Docu


Docu ابزار مستند سازي كدهاي دات نت شما است كه هدف اصلي آن سادگي است (سادگي در مقابل نمونه‌اي مانند sandcastle و برنامه‌هاي كمكي آن).
مشاهده‌ي سايت اصلي آن

براي استفاده از آن، در قسمت خواص پروژه در VS.NET ، در قسمت build ، تيك مربوط به توليد XML documentation را بايد گذاشت و سپس دستور زير را در خط فرمان اجرا نمائيد و همين:

docu your-assembly-name.dll


خروجي حاصل يك سري فايل html است كه به صورت خودكار توليد خواهند شد. نمونه‌اي از خروجي آن در اين آدرس قابل مشاهده است.


Krypton 3.5


Krypton مجموعه‌اي از كامپوننت‌هاي رايگان و غير رايگان مخصوص windows forms است. نگارش 3 و نيم آن اخيرا منتشر شده است و با ارائه اين مجموعه تعداد كامپوننت‌هاي رايگان آن به 41 عدد مي‌رسد.




تازه‌هاي اين نگارش:
KryptonDateTimePicker
KryptonMonthCalendar
DateTimePicker for KryptonRibbon
MonthCalendar for KryptonContextMenu
Per-KryptonPage ButtonSpecs


ماخذ

ابزار حذف دات نت فريم ورك‌هاي ناقص


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

دريافت

دقت داشته باشيد كه از اين ابزار به عنوان آخرين راه حل موجود بايد استفاده شود. ابتدا سعي كنيد از طريق control panel نسبت به عزل موارد موجود اقدام كنيد و اگر اينكار موفقيت آميز نبود، از ابزار فوق استفاده نمائيد.

ماخذ



۱۳۸۸/۰۱/۰۳

Subversion 1.6.0


نگارش جديد ساب ورژن پس از 9 ماه توسعه‌ي مداوم ، سه روز قبل منتشر شد.
بهبودهاي حاصل شده:
  • رفع بيش از 65 باگ
  • ذخيره سازي filesystem بهتر
  • اعتبار سنجي بهبود يافته
  • تشخيص تداخل‌هاي بهتر
  • و ...

البته اگر براي اولين بار است كه تحت ويندوز مي‌خواهيد ساب ورژن را نصب كنيد بهتر است از برنامه‌ي رايگان Visual SVN Server شروع كنيد. (كه تمام نيازهاي كاري شما را برآورده خواهد ساخت)
همچنين افزونه‌ي Visual SVN ويژوال استوديو نيز يكي از بهترين‌ها است (البته رايگان نيست).

۱۳۸۸/۰۱/۰۲

نگارش جديد CAT.NET ارائه شد


CAT.NET قبلا در اين سايت معرفي شده است. نگارش جديد آن در هفته‌ي قبل ارائه گرديد.
دريافت

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


مايكروسافت crash analysis tool خود را سورس باز كرد


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


براي نمونه از اين ابزار در طي سال‌هاي 2005 تا 2006 جهت بررسي كدهاي ويندوز ويستا بهره‌ برداري شده و توسط آن بيش از 300 باگ امنيتي پيش از سوء استفاده از آن‌ها كشف و برطرف گرديده است. اين ابزار اطلاعات حاصل از يك كرش را بررسي كرده و باگ‌هاي امنيتي ممكن آن‌را گوشزد مي‌كند.

صفحه‌ي اصلي پروژه در CodePlex
exploitable Crash Analyzer

و دمويي در مورد فلسفه‌ي وجودي و كاربردهاي اين ابزار
دريافت

آناليز نحوه‌ي عملكرد ويروس Conficker


احتمالا ويروس Conficker را كه مايكروسافت براي دستگيري نويسنده‌اش جايزه تعيين كرده بود، به ياد داريد. دو مقاله‌ي جامع در مورد تحليل و مهندسي معكوس اين ويروس (و مشابهات آن) اخيرا منتشر شده‌اند كه بسيار جالب توجه هستند :




۱۳۸۸/۰۱/۰۱

بتاي اول Silverlight 3.0 ارائه شد


نگارش بتاي سيلورلايت سه چند روزي است كه ارائه شده است.
ويژگي‌هاي جديد آن‌را در چند گروه مي‌توان بررسي كرد:
  • بهبودهاي گرافيكي : پشتيباني از GPU و گرافيك سه بعدي - Perspective 3D و Pixel Shaders
  • امكان توليد برنامه‌هاي Out-of-the-Browser (امكان اجراي برنامه‌هاي سيلورلايت مستقل از مرورگر وب)
  • بهبودهاي حاصل شده در امكانات برنامه نويسي آن: element binding, dynamic resources و ...
  • ارائه‌ي پيش نمايش expression blend نگارش 3 جهت پشتيباني بهتر از Silverlight 3.0
  • .NET RIA Services : n-tier application pattern
  • پشتيباني كامل از پخش ويديوهايي با فرمت HD
  • و ...

كتاب الكترونيكي رايگاني كه در MIX09 در اين‌باره توزيع شده است
دريافت

براي مطالعه بيشتر:
A guide to Silverlight 3 new features
Silverlight 3 Announced!


نگارش نهايي ASP.Net MVC ارائه شد

ليست اكران‌هاي نوروزي MIX09


MIX09 | Web Design and Development Conference






ليست به روز شده‌ي بلاگ‌هاي IT

ليست به روز شده‌ي بلاگ‌هاي برنامه نويسي و IT را به صورت فايل‌هاي OPML جهت سهولت استفاده در برنامه‌هاي فيد خوان، از آدرس‌هاي زير مي‌توانيد دريافت نمائيد:

100 بلاگ برتر برنامه نويسي در دنيا
دريافت

بلاگ‌هاي فعال در زمينه WPF
دريافت

و ليستي از وبلاگ‌هاي ايراني فعال در زمينه برنامه نويسي، IT ، اخبار IT، معرفي برنامه‌ها، eBook و امثال آن. (بيشتر از 150 ركورد)
دريافت

۱۳۸۷/۱۲/۲۲

BloggerToCHM


اين آخرين مطلب ارسالي من در سال 87 خواهد بود. پيشاپيش فرا رسيدن سال جديد را خدمت شما تبريك عرض كرده و براي همه‌ي شما آرزوي سالي خوب و با بركت را دارم.

برنامه‌ي كوچكي را تهيه كرده‌ام كه با دريافت لينك يك وبلاگ بلاگري، تمامي مطالب آن‌را (اعم از پست‌ها، كامنت‌ها و تصاوير) دريافت كرده و سپس حاصل را به صورت خودكار به يك فايل chm تبديل مي‌كند.
دريافت برنامه



پيش‌نياز اجرا:
- نصب دات نت فريم ورك 2 يا بالاتر (دات نت فريم ورك 3 و نيم، سرويس پك يك توصيه مي‌شود زيرا حاوي سرويس پك 2 دات نت فريم ورك 2 نيز هست و اين سرويس پك به صورت جدا ارائه نشده است)
- نصب برنامه‌ي معروف و رايگان html help work shop (كه از كامپايلر آن براي توليد فايل نهايي chm استفاده مي‌شود)

طرز استفاده از برنامه هم بسيار ساده‌است.
پس از نصب پيشنيازهاي ذكر شده، و نصب برنامه، يك shortcut روي دسكتاپ شما ايجاد مي‌شود كه به كمك آن مي‌توان برنامه را اجرا نمود.
سپس از منوي فايل، گزينه‌ي new blog را انتخاب كرده و آدرس اصلي يك وبلاگ بلاگري را وارد كنيد. همچنين يك نام گروه دلخواه را نيز براي آن وارد نمائيد و در آخر كليك بر روي دكمه‌ي add . لازم به ذكر است كه حتما هنگام ثبت بلاگ‌ها نياز به اتصال به اينترنت مي‌باشد، زيرا بايد بتوان آمار اوليه‌ي وبلاگ را دريافت نمود و همچنين مطمئن شد كه اين وبلاگ بلاگري است و فرمت مربوطه را دارد.
پس از ثبت يك بلاگ، يا مي‌توان بر روي آن كليك راست كرد و گزينه‌ي start processing را انتخاب نمود و يا وبلاگ‌هاي مورد نظر را تيك زد و سپس از منوي process گزينه‌ي start را انتخاب كرد تا عمليات دريافت اطلاعات وبلاگ‌هاي مورد نظر به ترتيب انجام شود.
در برنامه قسمت db to chm منظور حالت آفلاين است. وبلاگي را دريافت نموده‌ايد اما مي‌خواهيد مجددا فايل chm آن‌را تهيه كنيد. به اين صورت اطلاعات از ديتابيس برنامه دريافت خواهد شد بجاي دريافت از اينترنت.

نمونه‌ي فايل توليدي
دريافت خلاصه‌ي وبلاگ جاري


اگر به هر دليلي از طرح و رنگ پيش فرض فايل نهايي راضي نبوديد، به پوشه‌ي template برنامه مراجعه كرده و فايل‌هاي htm و css مورد استفاده را ويرايش كنيد و طرح و رنگ دلخواه خود را اعمال نمائيد. فقط دقت داشته باشيد كه در اين فايل‌هاي htm ، هرجايي كلمه‌اي با $ شروع شده بود يعني قسمتي است كه محتواي نهايي در آن‌جا قرار مي‌گيرد و اين نام نبايد تغييري كند (محل آن مهم نيست، نام آن مهم است). همچنين بديهي است كه نام سلكتورهاي فايل css مورد استفاده هم نبايد تغيير كند.

موفق باشيد.


پ.ن.
اگر در حين اجراي برنامه به مشكلي برخورديد، تمامي خطاهاي برنامه در فايلي به نام errors.log ثبت مي شود (در كنار فايل اجرايي برنامه توليد خواهد شد). لطفا اين فايل را جايي آپلود كنيد و سپس لينك دهيد تا بتوان مشكل را دقيق‌تر بررسي نمود.

به روز رساني‌ها:
نگارش 1.1
- ارتقاء به نگارش جديد open search api مورد استفاده گوگل
دريافت

نگارش 1.2
- رفع مشكل فاصله در آرگومان‌هاي كامپايل فايل نهايي
دريافت


لينك‌هاي هفته‌ي آخر اسفند


وبلاگ‌ها ، سايت‌ها و مقالات ايراني (داخل و خارج از ايران)

امنيت

Visual Studio

ASP. Net

طراحي و توسعه وب

PHP

اس‌كيوال سرور

سي شارپ

VB

عمومي دات نت

جاوا

ويندوز

مسايل اجتماعي و انساني برنامه نويسي

SVN

متفرقه

۱۳۸۷/۱۲/۲۱

نگهداري ايندكس‌ها در اس‌كيوال سرور


پس از مدتي كه از شروع به كار يك سيستم مي‌گذرد، همانطور كه تعريف ايندكس‌هاي مفيد سرعت جستجوها را بالا مي‌برد، ايجاد fragmentation در آن‌ها نيز تاثير منفي در كارآيي خواهد داشت. به همين منظور نياز است هر از چندگاهي بررسي شود ميزان fragmentation ايندكس‌ها چقدر است. اگر اين ميزان بيش از 30 درصد بود توصيه شده است كه از دستور DBCC INDEXDEFRAG استفاده شود يا بازسازي مجدد ( rebuild ) ايندكس‌ها صورت گيرد.

يكي ديگر از امكانات dmv هاي اس كيوال سرورهاي 2005 به بعد، ارائه آمار ميزان fragmentation ايندكس‌ها است كه كوئري آن به صورت زير مي‌تواند باشد:

USE dbName;
SELECT OBJECT_NAME(DMV.object_id) AS TABLE_NAME,
SI.NAME AS INDEX_NAME,
avg_fragmentation_in_percent AS FRAGMENT_PERCENT,
DMV.record_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') AS
DMV
LEFT OUTER JOIN SYS.INDEXES AS SI
ON DMV.OBJECT_ID = SI.OBJECT_ID
AND DMV.INDEX_ID = SI.INDEX_ID
WHERE avg_fragmentation_in_percent > 10
AND index_type_desc IN ('CLUSTERED INDEX', 'NONCLUSTERED INDEX')
AND DMV.record_count >= 2000
ORDER BY
TABLE_NAME DESC

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

براي بازسازي تمامي ايندكس‌هاي يك ديتابيس مفروض مي‌توان از كوئري زير استفاده كرد:

DECLARE @TableName VARCHAR(255)
DECLARE @sql NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 80
DECLARE TableCursor CURSOR
FOR
SELECT OBJECT_SCHEMA_NAME([object_id]) + '.' + NAME AS TableName
FROM sys.tables

OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER INDEX ALL ON ' + @TableName +
' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3), @fillfactor) + ')'

EXEC (@sql)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor

۱۳۸۷/۱۲/۲۰

Debugger visualizers


از VS.Net 2005 به بعد، امكانات اشكال زدايي كدها به شدت بهبود يافته و يكي از امكانات جالبي كه به آن اضافه شده است، Debugger visualizers مي‌باشد، يعني امكان مشاهده‌ي محتواي اشياء در حين ديباگ. همچنين با استفاده از SDK ويژوال استوديو، برنامه نويس‌ها مي‌توانند Debugger visualizers سفارشي خودشان را نيز تهيه كنند. در ادامه به تعدادي از اين موارد اشاره خواهد شد:
  • Xml Visualizer v.2 - site
  • Data Debugger Visualizer - site
  • WCF Visualizers Tool - site
  • IL Visualizer - site
  • DB Connection Visualizer - site
  • LINQ to SQL Debug Visualizer - site
  • Graphics Debugger Visualizer - site
  • Bitmap Debugger Visualizer - site
  • PowerShell Debug Visualizer - site
  • WebVisualizers - site
  • Sharepoint debug visualizer - site
  • WPF Tree Debugger Visualizer - site
  • GUID Debugger Visualizer - site
  • WindowsIdentity Debugger Visualizer - site
  • ControlTree visualizer - site
  • Regular Expression Visualizers - site
  • Improving Visual C++ Debugging - site

۱۳۸۷/۱۲/۱۹

اشتباهات متداول برنامه‌نويس‌هاي دات نت


اشتباه 1:
استفاده از

throw ex;
بجاي استفاده از
throw;
در حالت اول، تمام stack trace موجود تا نقطه‌ي فراخواني دستور ذكر شده پاك خواهند شد، اما در حالت دوم stack trace‌ حفظ شده و ديباگ كردن كد را ساده مي‌كند.

اشتباه 2:
درك اشتباه عملكرد متد replace :
string s = "Take this out";
s.Replace("this", "that"); //wrong
بجاي استفاده از :
s = s.Replace("this", "that");  //correct

اگر از fxCop استفاده كنيد، اينگونه خطاها را (عدم استفاده از مقدار بازگشتي) گوشزد مي‌كند.

اشتباه 3:
استفاده‌ي بي دقت از متغيرهاي استاتيك در يك برنامه وب. دو مثال زير را در نظر بگيريد:
public static string GetCookieName(Cookie c)
{
return c.Name;
}

static List<string> cookieList = new List<string>();
public static void AddToCookieList(Cookie c)
{
cookieList.Add(c.Name);

}

برنامه‌هاي وب ذاتا چند ريسماني هستند و زمانيكه يك متغير را از نوع استاتيك تعريف مي‌كنيد، اين متغير، هنگام مراجعه‌ي كاربران بين آن‌ها به اشتراك گذاشته مي‌شود و امكان تخريب يا استفاده‌ي ناصحيح از مقادير آن‌ها وجود خواهد داشت. در حالت اول نيازي به مباحث همزماني و قفل كردن منابع نيست زيرا متغيري كه در متد استفاده مي‌شود، thread safe است اما cookieList در مثال دوم خير و حتما هنگام استفاده از آن بايد مباحث قفل كردن منابع را درنظر داشت. (حتي اگر برنامه‌ي شما از نوع وبي هم نيست اما چند ريسماني است اين مطلب باز هم صادق مي‌باشد)


اشتباه 4:
مقابله با خطاها به شكلي نادرست: (اصطلاحا خفه كردن خطاها!)
 try
{
//something
File.Delete(blah);
}
catch{}
در اين حالت اگر خطايي رخ دهد كاربر متوجه نخواهد شد دقيقا مشكلي وجود داشته يا خير و علت آن چيست.
هرچند گاهي از اوقات اگر خطاي حاصل براي ما اهميتي نداشت مي‌توان از آن استفاده نمود، در غيراينصورت بايد حتما از اين روش پرهيز كرد.

اشتباه 5:
ارائه‌ي برنامه‌هاي ASP.Net با گزينه‌ي پيش فرض Debug=true در web.config كه پيشتر در مورد آن در اين سايت بحث شده است.


اشتباه 6:
عدم استفاده از امكانات ويژه‌ي دات نت فريم ورك هنگام كار با رشته‌ها:
string s = "This ";
s += "is ";
s += "not ";
s += "the ";
s += "best ";
s += "way.";

StringBuilder sb = new StringBuilder();
sb.Append("This ");
sb.Append("is ");
sb.Append("much ");
sb.Append("better. ");

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

اشتباه 7:
عدم استفاده از عبارت using هنگام استفاده از اشيايي از نوع Idisposable . مثالي در اين مورد.

using (StreamReader reader=new StreamReader(file))
{
//your code here

}

اشتباه 8:
فراموش كردن بررسي نال بودن يك شيء هنگام استفاده از آن.
string val = Session["xyz"].ToString();

اين نوع كد نويسي يكي از اشتباهات متداول تمامي تازه واردان به ASP.Net است. حتما بايد پيش از استفاده از متد ToString بررسي شود كه آيا اين سشن نال است يا نه. در غيراينصورت حاصل كار فقط يك exception خواهد بود. (استفاده از افزونه‌ي ري شارپر در اين موارد كمك بزرگي است، زيرا به محض قرار گرفتن مكان نما روي شيءايي كه احتمال نال بودن آن ميسر است، يك راهنما را به شما ارائه خواهد كرد)

اشتباه 9:
بازگشت دادن يك property عمومي از نوع ليست‌هاي جنريك.
با توجه به اينكه اين نوع ليست‌ها فقط خواندني نيستند و امكان دستكاري اطلاعات آن توسط فراخوان وجود دارد، توصيه مي‌شود از نوع جنريك IEnumerable استفاده شود. همچنين توصيه شده است هنگام انتخاب نوع پارامترهاي ورودي يك متد نيز به اين مورد دقت شود.

۱۳۸۷/۱۲/۱۸

غلط ياب فارسي در دات نت با استفاده از امكانات open office


مدتي است كه محصور كننده‌اي سورس باز براي امكانات غلط‌ ياب مجموعه‌ي open office در سايت code project ارائه شده است:
NHunspell - Hunspell for the .NET platform
دريافت آخرين نسخه‌ي آن از source forge

خوشبختانه كتابخانه‌ي واژه‌هاي فارسي هم براي اپن آفيس مهيا است.
دريافت

پس از دريافت كتابخانه‌ي فوق و همچنين فايل‌هاي مربوط به زبان فارسي، فقط كافي است ارجاعي به اسمبلي NHunspell.dll در برنامه اضافه شود و سپس يك مثال ساده در مورد استفاده از آن به صورت زير خواهد بود:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using NHunspell;

namespace testWinForms87
{
class CSpellCheck
{
public static void Test()
{
using (Hunspell hunspell = new Hunspell(@"fa_ir.aff", @"fa_ir.dic"))
{
bool correct = hunspell.Spell("دباق");
if (correct)
MessageBox.Show("مشكلي نيست!");
else
{
List<string> suggestions = hunspell.Suggest("دباق");
string result = string.Empty;
foreach (string suggestion in suggestions)
{
result += suggestion + Environment.NewLine;
}

if (result != string.Empty)
MessageBox.Show(result,"ليست پيشنهادها");
}
}
}
}
}




۱۳۸۷/۱۲/۱۷

دريافت مناسبت‌هاي سال 1388 از يك فايل XML


هميشه با نزديك شدن آخر سال، به روز كردن مناسبت‌هاي تقويم سال بعد ضروري مي‌شود. دوستان لينوكسي ما هم در اين مورد زحمت كشيده و برنامه‌اي را تهيه كرده‌اند كه از آدرس زير قابل دريافت است:
http://download.gna.org/jalali-calendar/

پس از دريافت برنامه، مناسبت‌هاي سال 1388 در فايل 1388.xml قابل مشاهده است (با تقدير و تشكر از زحمات اين عزيزان). فرض كنيد مي‌خواهيم اين اطلاعات را به اس كيوال سرور منتقل كنيم.
فرمت اين فايل به شكل زير است:

<?xml version="1.0" encoding="UTF-8"?>
<cal1388>
<day>
<num>1/1</num>
<desc>عید نوروز، لحظه تحويل سال:ساعت 15 و 13 دقيقه و 39 ثانيه </desc>
</day>
</cal1388>

حداقل سه راه حل براي انجام اينكار (خواندن فايل xml توسط اس كيوال سرور) موجود است:

راه اول:

SELECT '1388' saal,
X.day.query('num').value('.', 'nVARCHAR(50)') rooz_maah,
X.day.query('desc').value('.', 'nVARCHAR(max)') tozih
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK
'c:\1388.xml',
SINGLE_BLOB
) AS T(x)
) AS T(x)
CROSS APPLY x.nodes('cal1388/day') AS X(day);

راه دوم:

DECLARE @MyXML XML

SELECT @MyXML = CAST(x AS XML)
FROM OPENROWSET(
BULK
'c:\1388.xml',
SINGLE_BLOB
) AS T(x)

SELECT 1388 saal,
nref.value('num[1]', 'nvarchar(50)') rooz_maah,
nref.value('desc[1]', 'nvarchar(max)') tozih

FROM @MyXML.nodes('//day') AS R(nref)

راه سوم:
DECLARE @MyXML XML
DECLARE @handle INT

SELECT @MyXML = CAST(x AS XML)
FROM OPENROWSET(
BULK
'c:\1388.xml',
SINGLE_BLOB
) AS T(x)

EXEC sp_xml_preparedocument @handle OUTPUT,
@MyXML

SELECT 1388 saal,
*
FROM OPENXML(@handle, '/cal1388/day', 2) WITH
(num VARCHAR(20), [desc] NVARCHAR(MAX))

EXEC sp_xml_removedocument @handle

اكنون كه مي‌توانيم اطلاعات اين فايل را select كنيم، Insert آن ساده است . براي مثال:
INSERT INTO tblMonasebat
(
saal,
rooz_mah,
tozih
)
SELECT '1388' saal,
nref.value('num[1]', 'nvarchar(50)') rooz_maah,
nref.value('desc[1]', 'nvarchar(max)') tozih
FROM @MyXML.nodes('//day') AS R(nref)

بديهي است امكان مقدار دهي @MyXML به صورت يك رشته كه حاوي محتويات فايل است نيز مهيا مي‌باشد (بجاي خواندن از فايل).

براي مطالعه‌ي بيشتر
XML Support in Microsoft SQL Server 2005
Beginning SQL Server 2005 XML Programming

۱۳۸۷/۱۲/۱۶

Security Now


نمي‌دونم به پادكست علاقه داريد يا نه، ولي محض اطلاع يك سري پادكست در مورد مباحث امنيتي و به خصوص با تكيه بر رمزنگاري اطلاعات از آدرس زير قابل دريافت است:


اين مجموعه تا امروز 186 قسمت شده و براي نمونه تعدادي از آن‌ها به شرح زير هستند:

۱۳۸۷/۱۲/۱۵

لينك‌هاي هفته‌ي سوم اسفند


وبلاگ‌ها ، سايت‌ها و مقالات ايراني (داخل و خارج از ايران)

امنيت


Visual Studio

ASP. Net

طراحي و توسعه وب

PHP

اس‌كيوال سرور

سي شارپ

عمومي دات نت

ويندوز

مسايل اجتماعي و انساني برنامه نويسي

متفرقه

۱۳۸۷/۱۲/۱۴

مروري بر كاربرد DoEvents


چند روز قبل هنگام استفاده از DoEvents در يك برنامه windows forms ، ناگهان پيغام stack overflow ظاهر شد! براي علت يابي و رفع آن كمي جستجو كردم كه خلاصه‌ي آن به شرح زير است:


DoEvents چيست؟

DoEvents يكي از متدهاي كلاس Application در فضاي نام System.Windows.Forms است.
ويندوز جهت مديريت رخدادهاي مختلف از يك صف استفاده مي‌كند. رخدادهايي مانند كليك ماوس، تغيير اندازه‌ي يك فرم و مواردي شبيه به آن ابتدا در يك صف قرار مي‌گيرند و سپس پردازش مي‌شوند. زمانيكه كنترلي مشغول پاسخ دهي به يك رخ‌داد مي‌گردد، ساير رخ‌دادها هنوز در صف هستند و پردازش نخواهند شد. بنابراين اگر برنامه‌ي شما در يك روال رخ‌دادگردان كليك، عملياتي طولاني را در حال انجام باشد، بدليل عدم پردازش ساير رخ‌دادها اينطور به نظر خواهد رسيد كه هنگ كرده است.
روش صحيح پردازش يك عمليات طولاني استفاده از يك ترد ديگر مي‌باشد تا ترد اصلي برنامه كه كار مديريت رابط كاربر برنامه را به عهده دارد، درگير اين عمليات طولاني نشده و پاسخگوي رخ‌دادهاي رسيده باشد.
راه ميان‌بر و ساده‌اي كه اينجا وجود دارد استفاده از DoEvents مي‌باشد (بدون ايجاد يك ترد جديد). براي مثال اگر در روال رخ دادگردان كليك يك برنامه، حلقه‌اي طولاني در حال پردازش است، هر از چندگاهي اين متد فراخواني شود، رخ‌دادهاي در صف قرار گرفته فرصت ارسال به ترد اصلي برنامه را يافته و برنامه در حالت هنگ به نظر نخواهد رسيد.
براي نمونه مثال زير را در دو حالت با Application.DoEvents و بدون آن اجرا كنيد:

private void btnProcessWithDoEvents_Click(object sender, EventArgs e)
{
for (int i = 0; i < 100000; i++)
{
TextBox1.Text = "Processing " + i.ToString();
Application.DoEvents();
}
}

در حالت بدون استفاده از Application.DoEvents ، تنها آخرين عبارت پردازش شده را در TextBox1 مشاهده خواهيد كرد و همچنين در اين حين، برنامه در حالت هنگ به نظر مي‌رسد و برعكس.

مشكلات احتمالي حاصل از استفاده از Application.DoEvents :

الف) حس غلط پايان يافتن عمليات پيش از موعد
در مثال فوق در حين استفاده از Application.DoEvents ، دكمه‌ي btnProcessWithDoEvents مجددا فعال شده و قابل كليك كردن مي‌شود ولي آيا اين بدين معنا است كه پردازش قبلي به پايان رسيده است؟ به يك سري از كاربرها هم click-happy user گفته مي‌شود! يعني از كليك كردن مجدد لذت مي‌برند! در اين حالت حتما بايد دكمه‌ي btnProcessWithDoEvents را در ابتداي پردازش غيرفعال كرد و سپس در انتهاي آن بايد مجددا فعال شود.
مورد مشكل كليك مجدد حتي مي‌تواند منجر به تخريب اطلاعات در حال پردازش شود. فرض كنيد برنامه در حال ذخيره‌ي اطلاعات در يك فايل است و كاربر مرتبا بر روي دكمه‌ي پردازش مربوطه كليك كنيد. فايل نهايي از يك سري اطلاعات ناهماهنگ و بي‌ربط پر خواهد شد.

ب) مشكل stack overflow
اگر علاقمند باشيد، اين مورد را مي‌توان به صورت زير شبيه سازي كرد:

يك تايمر را به برنامه اضافه كنيد و يك دكمه. در روال رخ‌دادگردان كليك مربوط به دكمه، دستورات زير را اضافه كنيد:

private void btnStartTimer_Click(object sender, EventArgs e)
{
this.timer1.Enabled = true;
this.timer1.Start();
this.timer1.Interval = 20;

}
و در روال tick مربوط به تايمر، دستورات زير را اضافه كنيد:

private void timer1_Tick(object sender, EventArgs e)
{
Thread.Sleep(50);
Application.DoEvents();
}
برنامه را اجرا كرده و يكي دو دقيقه صبر كنيد، حتما با پيغام خطاي stack overflow مواجه خواهيد شد. چرا؟
فواصل زماني اجراي تايمر به 20 ميلي ثانيه تنظيم شده است اما در روال رخ‌داد گردان tick آن، نياز به 50 ميلي ثانيه (بيش از 20 ميلي ثانيه) يا بيشتر براي اجرا دارد. با رسيدن به Application.DoEvents ، رخ‌داد در صف قرار گرفته‌ي ديگر tick بلافاصله اجرا مي‌شود و همينطور الي آخر، تا بالاخره stack overflow حاصل خواهد شد.


پس چه بايد كرد؟

الف) هنگام استفاده از Application.DoEvents به موارد فوق حتما دقت داشته باشيد.
ب) بجاي استفاده از اين روش كه در بيشتر موارد يك ضعف برنامه نويسي محسوب مي‌شود، شروع به استفاده از روش‌هاي غيرهمزمان نمائيد. براي مثال استفاده از :
BackgroundWorker
Asynchronous delegates
Threads

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

جهت مطالعه بيشتر
Keeping your UI Responsive and the Dangers of Application.DoEvents


۱۳۸۷/۱۲/۱۳

ويديوي رايگان LINQ Programming with C# 3.0


مواردي را كه در اين ويديو مشاهده خواهيد كرد:

  • Introduction to LINQ
  • C# 3.0 Language Features
  • LINQ to Objects
  • Lambda Expressions
  • LINQ to DataSets
  • Getting Started with LINQ to SQL
  • Additional LINQ to SQL Features
  • LINQ to XML
  • LINQ to Entities and the Entity Framework

دريافت فايل

ماخذ

۱۳۸۷/۱۲/۱۲

تعيين اعتبار كردن يك عبارت SQL - قسمت دوم


مطلبي را روز قبل نوشتم در مورد تعيين اعتبار يك كوئري. اين مورد از آنجايي حائز اهميت مي‌شود كه براي مثال تغييري در ساختار يكي از جداول حاصل شود. اكنون مي‌خواهيم بررسي كنيم آيا سيستم از كار افتاده يا نه!؟
شما مي‌توانيد نام يك فيلد را تغيير دهيد (حتي اگر اين فيلد در يك رويه ذخيره شده استفاده شده باشد) و هيچ خطايي هم نخواهيد گرفت و اين منشاء دردسرهاي زيادي خواهد بود.
در حالت استفاده از SET NOEXEC ON ، كوئري مورد نظر فقط كامپايل مي‌شود و همچنين از لحاظ نحوي بررسي خواهد شد، اما اين كافي نيست.
مثال زير را در نظر بگيريد:

Create PROCEDURE Test1
AS
SELECT * FROM tblPIDs1
جدول tblPIDs1 در ديتابيس مورد نظر وجود ندارد.
اين كوئري قابل اجرا است. دكمه‌ي F5 را فشار دهيد، بلافاصله رويه ذخيره شده‌ي Test1 براي شما ايجاد خواهد شد.
سپس كوئري زير را اجرا كنيد:

USE testdb
SET NOEXEC ON;
exec test1 ;
SET NOEXEC OFF;
بدون مشكل و بروز خطايي، پيغام زير را نشان مي‌دهد:
Command(s) completed successfully

ايرادي هم وارد نيست چون فقط عمليات parsing و compile صورت گرفته و نه اجراي واقعي رويه ذخيره شده. اينجا از لحاظ دستوري مشكلي وجود ندارد.

در اين نوع موارد مي‌توان از SET FMTONLY ON استفاده كرد. اين مورد اجراي غير واقعي يك كوئري را سبب مي‌شود (تاثيري روي ديتابيس موجود نخواهد داشت، براي مثال اگر در رويه ذخيره شما عبارت insert وجود داشت، ديتايي insert نخواهد شد) و تنها متاديتاي حاصل را بازگشت مي‌دهد. مثلا نام ستون‌هاي يك كوئري را و همچنين در اين حين اگر خطايي رخ داده باشد، آن‌را نيز ارائه خواهد داد.

USE testdb
SET FMTONLY ON;
exec test1 ;
SET FMTONLY OFF;
با اجراي كوئري فوق خطاي زير ظاهر مي‌شود:
Msg 208, Level 16, State 1, Procedure test1, Line 3
Invalid object name 'tblPIDs1'.
براي اتوماسيون اين توانايي مي‌توان از كوئري زير استفاده كرد:

USE testdb;

SET NOCOUNT ON;

DECLARE @name NVARCHAR(MAX),
@sql NVARCHAR(MAX),
@type CHAR(2), -- object type
@type_desc NVARCHAR(60), -- object type description
@params NVARCHAR(MAX) -- parameters

DECLARE @tblInvalid TABLE (
-- invalid objects
[type_desc] NVARCHAR(60),
[name] NVARCHAR(MAX),
[error_number] INT,
[error_message] NVARCHAR(MAX),
[type] CHAR(2)
);

DECLARE testSPs CURSOR FAST_FORWARD
FOR
SELECT [name] = OBJECT_NAME(SM.[object_id]),
[type] = SO.[type],
SO.[type_desc],
[params] = (
SELECT (
SELECT CONVERT(
XML,
(
SELECT STUFF(
(
SELECT ', ' + [name] +
'=NULL' AS
[text()]
FROM sys.parameters
WHERE [object_id] = SM.[object_id]
FOR XML PATH('')
),
1,
1,
''
)
)
)
FOR XML RAW,
TYPE
).value('/row[1]', 'varchar(max)')
)
FROM sys.sql_modules SM
JOIN sys.objects SO
ON SO.[object_id] = SM.[object_id]
WHERE SO.[is_ms_shipped] = 0
AND SO.[type] = 'P'


OPEN testSPs
FETCH NEXT FROM testSPs INTO @name, @type, @type_desc, @params

WHILE (@@FETCH_STATUS = 0)
BEGIN
BEGIN TRY
SET @sql = 'SET FMTONLY ON; exec ' + @name + ' ' + @params +
'; SET FMTONLY OFF;'
--PRINT @sql;
EXEC (@sql) ;
END TRY
BEGIN CATCH
PRINT @type_desc + ', ' + @name + ', Error: ' + CAST(ERROR_NUMBER() AS VARCHAR)
+ ', ' + ERROR_MESSAGE();
INSERT INTO @tblInvalid
SELECT @type_desc,
@name,
ERROR_NUMBER(),
ERROR_MESSAGE(),
@type

;
END CATCH


FETCH NEXT FROM testSPs INTO @name, @type, @type_desc, @params
END
CLOSE testSPs
DEALLOCATE testSPs


SELECT [type_desc],
[name],
[error_number],
[error_message]
FROM @tblInvalid
ORDER BY
CHARINDEX([type], ' U V PK UQ F TR FN TF P SQ '),
[name];

توضيحات:
اين كوئري، در ديتابيس جاري كه در قسمت use dbname مشخص مي‌شود، تمامي رويه‌هاي ذخيره شده را به صورت خودكار پيدا مي‌كند. سپس ليست آرگومان‌هاي آن‌ها را نيز يافته و عبارت exec مربوطه را تشكيل مي‌دهد. سپس با استفاده از SET FMTONLY ON سعي در شبيه سازي اجراي تك تك رويه‌هاي ذخيره شده مي‌كند. اگر خطايي در اين بين رخ داد، آن‌ها را در يك جدول موقتي ذخيره كرده و در آخر نتيجه را نمايش مي‌دهد.

ارزش اين كوئري زماني مشخص مي‌شود كه تعداد زيادي رويه ذخيره شده داشته باشيد اما نمي‌دانيد كداميك از آن‌ها بر اساس آخرين تغييرات صورت گرفته، هنوز معتبر هستند يا نه. آيا به قول معروف، سيستم اومد پايين يا خير!؟

نكته:
قسمتي كه از XML استفاده شده جهت concatenating نتيجه حاصل از كوئري، مورد استفاده قرار گرفته و اين روزها بحث رايجي است كه در بسياري از سايت‌ها در مورد آن مي‌توان مطالب مفيدي را يافت. راه ديگر انجام آن استفاده از COALESCE مي‌باشد.


مآخذ:
Check Validity of SQL Server Stored Procedures
Which of your Stored Procedures are no longer Valid
SET FMTONLY ON