پست‌ها

نمایش پست‌ها از 2011

اصل Dependency Inversion چیست؟

تصویر
در سري پست هاي تعريف اصول SOLID  با اصل Single Responsibility اصل Open Closed اصل Liskov Substitution اصل Interface segregation آشنا شديم در اين پست پنجمین اصل يعني Dependency inversion رو برسي ميكنيم. هدف Dependency inversion اینه که کلاس های سطح بالا نبایستی به صورت مستقیم وابسته به کلاس های سطح پایین باشن بلکه رابطه ی بین کلاس ها بایستی براساس Abstract ها یا Interface ها باشه. بعنوان مثال اگه کلاس سطح بالای سیستم رو business logic بدونیم و این سطح وابسته به جزئیات سطح پایین مثلا ذخیره در بانک اطلاعاتی باشه استفاده مجدد از کلاس های business logic مارو کم میکنه انجام تست روی کلاس های business logic ما سخت میشه عکس زیر برگرفته از کتاب Dependency Injection in .NET هست که Dependency Injection (الگويي براي رعايت اين اصل) رو بخوبی توضیح داده مدير يك هتل ارزان قيمت براي اينكه سشوار دزيده نشه اونو به پريز بسته و اين يعني وابستگي بين سشوار و پريز تغيير در هركدوم ;ديگري رو تحت تاثير قرار ميده. و اما براي مثال عملي فرض كنيد کلاسی بنام GetMessageFro

اصل Interface Segregation چیست؟

تصویر
در سري پست هاي تعريف اصول SOLID  با اصل Single Responsibility اصل Open Closed اصل Liskov Substitution آشنا شديم در اين پست چهارمین اصل يعني Interface Segregation رو برسي ميكنيم. همنطور که قبلا اشاره کردم هدف این اصل اینه که اینترفیس بزرگ رو براساس استفاده کننده های اون اینترفیس و اهداف مختلف به اینترفیس های کوچکتر تبدیل کنیم و در نتیجه یک استفاده کننده از اون اینترفیس (مثلا یک کلاس) رو مجبور به پیاده سازی متدهای که بهشون نیاز نداره نکنیم و کلاس های پیچیده هم بجای استفاده از یک اینترفیس بزرگ از چندین اینترفیس استفاده کنن. توجه کنید که اگه ما کلاسی رو مجبور کنیم مثلا یک متد رو که اصلا بهش نیاز نداره پیاده سازی کنه و برای مثال بیاد تو اون متد NULL برگردونه یا مثلا Exception صادر کنه علاوه بر نقض اصل  Interface Segregation ;در ارث بری ما اصل Liskov Substitution رو هم نقض کردیم. به عکس زیر توجه کنید فرض کنید تو یک پروژه Web بخواهید ASP.NET Membership رو شخصی سازی کنید و مثلا قسمت بازیابی با ایمیل رو تغییر بدید تقریبا میشه گفت بیخیال این کار میشید و اما بر

اصل Liskov Substitution چيست؟

در سري پست هاي تعريف اصول SOLID  با اصل Single Responsibility اصل Open Closed آشنا شديم در اين پست سومين اصل يعني Liskov substitution رو برسي ميكنيم. هدف اين اصل اينه كه در ارث بري كلاس مشتق شده بايد به گونه اي طراحي بشه كه در صورت نياز با كلاس پايه ي خودش قابل تعويض باشه. مثال ي كه تو تعاريف اين اصل معمولا مطرح ميشه آيا مربع يك مستطيل هست؟ در منطق هندسه یک مربع نوع خاصی از مستطیل هست که دارای چهار ضلع مساوی میباشد ولي در شي گرائي داستان چيز ديگس… در واقع ما با ارث بردن كلاس مربع از كلاس مستطيل اصل Liskov substitution رو نقض ميكنيم چون با فرض وجود متد هاي setWidth و setHeight در كلاس مستطيل ما مجبوريم اين متد ها رو به گونه ي در كلاس مربع تغيير بديم كه طول و عرض يكي بشه و از اين رو كلاس مشتق شده يعني مربع قابل تعويض با كلاس پايه يعني مستطيل نيست و… اين اصل با اصل Open Closed ارتباط داره توجه كنيد اگه شما نتونيد از كلاس مشتق شدتون بجاي كلاس پايه استفاده كنيد در واقع و بنوعي اصل Open Closed رو رعايت نكرديد. و اما براي مثال عملي فرض كنيد كلاسي ب

اصل Open Closed چيست؟

در سري پست هاي تعريف اصول SOLID  با اصل Single Responsibility آشنا شديم در اين پست دومين اصل يعني Open Closed رو برسي ميكنيم. اين اصل ميگه يك كلاس بايد براي توسعه باز و براي تغيير بسته باشه بنابراين طراحي شما بايد به گونه ي باشه كه براي اضافه كردن يك قابليت جديد به كلاستون حداقل تغيير ممكن رو تو كلاستون داشته باشيد.در واقع بايد براي اضافه كردن قابليت جديد از كلاس جديد استفاده كنيم چون فرض شده تغيير تو كلاسي كه قبلا ساخته شده و داره ازش استفاده ميشه منجر به نتايج ناخواسته (باگ و…) در استفاده كننده هاي اين كلاس (مثلا يك كلاس ديگر) ميشه. ابهامات احتمالي كلاسي كه نبايد تغيير كنه پس نياز به تست واحد هم نداره؟ اگه كلاس باگ داشت چي(نياز به تغيير)؟ جواب بعضي از اين ابهامات + و + (شايد نادرست) حتي اگه شما اصل Open Closed رو رعايت كرده باشيد امكانش هست سهوا يك كلاس رو تغيير بديد پس تست واحد رو داشته باشد! كلاسي كه براي اولين بار طراحي شده براي صحت عملكرد بايد تست بشه پس شما تست واحد رو از قبل داريد(توجيه خوبي براي اولين ابهام) مورد استفاده اين اصل بيشتر

اصل Single Responsibility چیست؟

تو دنیای برنامه نویسی و البته شیء گرایی SOLID مجموعه ی از 5 قاعده (اصل) ابتدایی شامل Single responsibility Open-closed Liskov substitution Interface segregation Dependency inversion هست و توسط رابرت مارتین در اوایل سال 2000 معرفی شده و … شاید اکثرا با تعاریف این اصول آشنا باشین (درست یا غلط)  ولی بشخصه زیاد با مثال های که تو تاپیک های از این دست زده میشه مشکل دارم(انواع و اقسام اشکال هندسی)  قصد دارم این اصول رو با مثال های نزدیکتر با دنیای واقعی شرح بدم منظور مثال های از برنامه های تجاری(البته اگه پیدا کنم) قبل از شروع از اساتید و دوستانی که (شاید) این پست رو میبینن درخواست میکنم در صورت خطا (برداشت غلط و…) تو مطالب و مثال های ارائه شده منو راهنمایی کنن. اصل Single responsibility تعریف کردن این اصل خیلی راحته ولی انجامش در عمل سخته و تقریبا میشه گفت مثل امنیت همیشه %100 نیست. این اصل میگه هر کلاس فقط باید یک مسئوليت داشته و همچنیا میگه هر کلاس باید یک دلیل برای تغییر داشته باشه همونطور که گفتم راحت تعریف میشه

الگوهای ابتدایی برای برنامه نویسی دات نت

در این پست چند الگوی شاید معمولی ولی بسیار مهم لیست شده.مطلب جالبیه تنها مشکلش اینه که مثال های اون به هر زبانی هست جز #C. تو این پست معادل های دات نت ی اون لیست شده. 1-ارزیابی موجود بودن یک شی (null نبودن) قبل از فراخوانی متدها و خواص های اون تکنیکی به نام “andand” وجود داره که طی اون هنگام فراخوانی مثلا یک متد یک شی نام اون شی رو با فراخوانی متدش AND منطقی میکنیم و این باعث میشه تنها در صورتی که شی ما موجود باشه (null نباشه) متد مربوطه فراخوانی شه. به این مثال تو زبان JavaScript توجه کنید var parsed_content = window.JSON && window.JSON.parse("{}"); تا جایی که من میدونم و سرچ هم کردم چنین ویژگی تو #C موجو نیست. و اما این کار رو به روش های دیگه ی میشه انجام داد مثلا با یه IF قبلش چک کنیم شی ما null نباشه تنها مشکلش اینه که در صورتی که شی ما تو در تو باشه تعداد IF های ما زیاد میشه. const string xmlDoc = @" <opml version=""1.0""> <head>

مقدمه ای بر RavenDB – قسمت سوم

تصویر
در دو قسمت اول و دوم “مقدمه ای به RavenDB” به آشنایی با مقدمات RavenDB پرداختیم تو این قسمت میخواهیم با یک مثال در عمل با RavenDB آشنا بشیم. برای شروع یک پروژه ASP.NET MVC 3 رو ایجاد میکنیم. اگه از قسمت اول یادتون باشه گفتم یکی از 4 روش راه اندازی (هاست کردن) RavenDB به صورت مدفون شده یا Embed هست برای استفاده از این روش کافیه پکیج RavenDB-Embedded رو با NuGet نصب کنیم. همونطور که قبلا گفتم RavenDB به صورت schema-less هست ازاینرو برای کار با بانک نیاز نیست شما بانک و جدولی رو از قبل بسازید (کاری که با بانک های Embedded دیگه مثله SQL Server Compact انجام میدیم) تنها پس از اولین فراخوانی متد initialize شی DocumentStore ما فایل های مربوطه (همان بانک RavenDB) ساخته میشه. برای ذخیره بانک ما از پوشه استاندارد App_Data استفاده میکنیم. در طول چرخه حیاط یک برنامه بایستی یکه وهله از بانک در دسترس باشه ازاینرو از الگوی Singleton استفاده میکنیم. public class DataDocumentStore { private static IDocumentStore _instance; public static IDocumentStore Instance { get

مقدمه ای بر RavenDB – قسمت دوم

تصویر
در پست قبلی با استفاده از Management Studio دیتای تستی ساختیم. حالا یه شرح مختصری از سند و مجموعه سند ( document ) چیست؟ سند در واقع یک شی JSON هست و معادل یک ردیف (رکورد) تو بانک های رابطه ای RDBMS محسوب میشه برای آشنایی بیشتر با ساختار سند روی یکی از سند های ایجاد شده کلیک و دکمه Edit رو بزنید. همونطور که تو شکل میبینید یکه سند شامل یک کلید , دیتا و متا دیتا هست. کلید (تو این شکل albums/20) رو میشه با PK یا کلید اصلی تو بانک های رابطه ای RDBMS قیاس کرد. دیتا در واقع کل شی(در اینجا آلبوم) شما در فرمت JSON هستش. متا دیتا هم بصورت اتومات ایجاد میشه مثلا در این شکل Raven-Clr-Type یکه شی دات نت ی هست که به سند ما مپ شده. Raven برای اختصاص کلید به هر سند از روش guid ترتیبی (sequential guid) استفاده میکنه که هم بصورت جهانی یکتا هست و هم با توجه به ترتیبی بودن به خوبی ایندکس میشه البته توجه کنید برای اختصاص کلید به یک سند میشه کلید رو به صورت صریح مشخص کرد و هم کلید رو به صورت Identity key اختصاص داد.خود Raven بصورت داخلی از Identity key پشتیبانی میکنه(تو پست های بع

مقدمه ای بر RavenDB – قسمت اول

تصویر
بانک اطلاعاتی RavenDB یک بانک اطلاعاتی سندگرا ی متن باز برای پلتفرم دات نت / ویندوز هست که هر سند رو تو فرمت JSON ذخیره میکنه.تو بانک اطلاعاتی سندگرا هر موجودیت (Entity) میتونه بعنوان یک سند ذخیره بشه. این بانک ها اصطلاحا schema-less هستن یعنی نیازی نیست شما برای ذخیره کردن موجودیت مورد نظرت (مثلا کالا) بری اسکیمای اونو تو بانکت تعریف کنی کاری که ما تو RDBMS ها انجام میدیم و برای مثلا کالا جدولی شامل شماره کالا , نام کالا ,نوع کالا و… تعریف میکنیم. RavenDB جزء بانک های NoSQL است. NoSQL چیست؟ برای تعریف NoSQL، من فکر می کنم بهتره از این حیث بررسی کنیم که NoSQL چه چیزی نیست؟ یعنی یه جورایی از فرض خلف به مفهومش برسیم. این تکنولوژی، SQL نیست و بصورت رابطه ای هم نیست. همانطور که از نامش پیداست جایگزینی برای مدیریت بانک های اطلاعاتی رابطه ای (RDBMS)  هم نیست، اما آنرا پیاده سازی می کند! NoSQL برای ذخیره سازی داده ها بصورت توزیع شده، جایی که حجم داده های ما در مقیاس بالا باشد، وارد میدان می شود … استفاده از بانک اطلاعاتی RavenDB چه منفعتی برای ما داره؟ کارایی بهتر ت

Drag و Drop کردن در الگوی MVVM

برای اضافه کردن یه قابلیت جدید به برنامه ي OPMLtools نیاز به Drag&Drop داشتم. برای انجام Drag&Drop تو حالت عادی تقریبا کار سختی نداریم ولی وقتی Drag&Drop رو تو MVVM بخوایم کار سخت میشه و… بعد جستجو به فریمورک متن باز GongSolutions رسیدم که کار Drag&Drop رو تو MVVM خیلی ساده میکنه. برای دانلود dll مربوطه میتونید از این روش کمک بگیرید یا از اینجا دانلود کنید. و اما نحوه استفاده همونطور که تو کد XAML بالا میبیند نحوه اضافه کردن قابلیت Drag&Drop خیلی سادس ویژگی های IsDragSource و IsDropTarget همونطور که از اسمشون پیداس مشخص میکنن که آیا کنترل مورد نظر میتونه مبدا و مقصد یک عمل Drag&Drop باشه. قسمت مهم این کد مقید کردن هندلر رخداد Drop به ViewModel ما به کمک ویژگی DropHandler هست. و اما تو ViewModel بازم کار برای ما راحت شده فقط کافیه اینترفیس IDropTarget رو پیاده سازی کنیم که شامل 2 متد DragOver و Drop میشه. public void DragOver(DropInfo dropInfo) { if (dropInfo.Data is OpmlModel && dropInfo.TargetItem is OpmlModel

دي كامپايل كردن اسمبلي هاي CLR

هنگام Deploy كردن پروژه SQL CLR در SQL Server اسمبلي مربوطه در VIEW ي sys.assembly_files ذخيره ميشه. SELECT * FROM sys.assembly_files بصورت پيش فرض براي كمك در ديباگ كردن گزينه Deploy Code فعاله و سورس كد شما هم تو ديتابيس ذخيره ميشه.خوب براي ديدن سورس اسمبلي مورد نظر كافيه اونو Cast كنيم به VARCHAR(max) و تمام. SELECT CAST(content AS VARCHAR(max)) FROM sys.assembly_files ولي اگه گزينه Deploy Code رو غير فعال كنيم فقط Dll مربوطه تو ديتابيس ذخيره ميشه و … براي اين مورد كافيه ما Dll رو داشته باشيم و با .NET Reflector به سروس برسيم. و اما نكته اينه كه چجوري به Dll برسيم بعد سرچ به اين كد رسيدم (CLR Procedure) كه مياد Dll ذخيره شده تو ديتابيس رو داخل ديسك ذخيره ميكنه. using System; using System.IO; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Security.Permissions; namespace ExtractSqlAssembly { [PermissionSet(SecurityAction.Demand, Unrestricted = true,

برطرف كردن مشكل افزونه Regionerate در Visual Studio

بعد از نصب كردن آخرين نسخه افزونه Regionerate هنگام اجراكردن Visual Studio پيغام اروري با محتواي زير صادر ميشد. A problem occured while trying to initialize menus. System.ArgumentException: A Command with that name already exists. at EnvDTE80.Commands2.AddNamedCommand2(AddIn AddInInstance, String name, String ButtonText, String Tooltip, Boolean MSOButton, Object Bitmap, Object[]& ContextUIGUIDs, Int32 vsCommandStatusValue, Int32 CommandStyleFlags, vsCommandControlType ControlType) at Rauchy.Regionerate.Presentation.Addins.VisualStudio2005.Connect. OnConnection(Object application, ext_ConnectMode connectMode, Object addInInst, Array& custom) You may have to restart Regionerate. براي رفع اين مشكل اين فايل رو (Regionerate.Presentation.Addins.VisualStudio2005.dll) در مسير زير كپي (Replace) كنيد. C:\Program Files\Regionerate در ويندوز هاي 64 بيتي آدرس زير C:\Program Files (x86)\Regionerate با توجه به سورس باز بودن اين افزونه با يك تغ

چندين نكته هنگام استفاده از تابع AVG در SQL SERVER

هنگام استفاده از تابع تجميعي AVG ممكنه با ارور زير مواجه بشيد Arithmetic overflow error converting expression to data type int. اين مشكل معمولا در مواقعي كه تعداد ركورد ها زياد باشن پيش مياد. تابع AVG برا اساس نوع ستوني كه روش داره كار ميكنه خروجي رو تعيين ميكنه.براي مثال اگه ستون شما INT باشه خروجي هم INT ميشه و مثل COUNT_BIG نيست كه خروجيش از نوع  BIGINT باشه.حال اگه مقدار خروجي بشتر از مقدار INT باشه ارور بالا صادر ميشه. براي رفع ميايم ورودي رو به BIGINT تبديل ميكنيم و تمام. AVG(cast(innerResult.DiffTime AS BIGINT)) AS [avgTime] مورد بعدي اينه كه تابع AVG از مقادير NULL چشم پوشي ميكنه فقط ممكنه با مشكل خروجي NULL مواجه بشيد توجه كنيد تابع AVG ميتونه مقدار NULL برگردونه بجاي صفر(البته منطقي هم هست). براي رفع مشكلاتي از اين دست در LINQ خوندن + و + پيشنهاد ميشه. و اما در SQL ميشه از روش زير استفاده كرد SELECT ISNULL(AVG(3+3+3+NULL),0)

برنامه ي OPMLtools

تصویر
پیشتر در رابطه با پاک کردن فید های تکراری مطلبی رو نوشته بودم تا اینکه چند وقت پیش این سوال رو تو سایت داناترین دیدم فرض کنید من چندتا bundle رو مشترک میشم که بعضی از فیدهاش رو قبلا مشترک بودم. حالا برای حل مشکل اشتراک های تکراری از یک فید چه راه حلی وجود داره؟ فرض کنید تعداد فیدها خیلی زیاده و امکان بررسی و حذف بصورت دستی وجود نداره. آیا افزوننه ای برای این کار وجود نداره؟ برای حل این مشکل برنامه ی کوچیکی رو تهیه کردم که با گرفتن فایل OPML فید های تکراری رو پاک میکنه و فایل یک دست شده رو براتون ایجاد میکنه. یکی از ویژگی های این برنامه اینه که ساختار فایل اصلی رو حذف نمیکنه یعنی اگه شما چندین سطح تودرتو داشته باشید این ساختار رو تو فایل خروجی حفظ میکنه(این قسمتش وقتمو زیاد گرفت) برای نوشتن این برنامه از نرم افزار سورس باز جناب نصیری خیلی ایده گرفتم از این فرصت استفاده میکنم و از ایشون تشکر میکنم. پيشنياز استفاده از اين برنامه ، نصب دات نت فريم ورك 4 است. http://opmltools.codeplex.com/

ديتابيس رنگي

تصویر
منبع

هندل کردن خطاها در حلقه های موازی

در حالت عادی در حلقه های ترتیبی بعد از بوجود اومدن یک خطا (Exception) ادامه حلقه متوقف میشود ولی در حلقه های موازی بعد از بوجود اومدن خطا Thread های در حال اجرا اجازه دارن تا تکمیل کارشون اجرا بشن ولی مابقی تکرار های حلقه دیگه اجرا نمیشن. با توجه به اینکه چندین Thread همزمان در حال اجرا هستن احتمال اینکه چندین خطا (Exception) داشته باشیم زیاده از اینرو بجای کلاس Exception با کلاس AggregateException سرو کار داریم که یکی از خواصیت های (Property) اون InnerExceptions هست که شامل کلکسیونی از خطا ایجاد شده طی ه حلقه ماست. در مواجه با خطا معمولا 2 حالت پیش میاد 1-متوقف شدن حلقه در صورت ایجاد خطا 2-ادامه حلقه در صورت ایجاد خطا حالت اول بصورت پیش فرض اعمال میشه (البته همونطور که در ابتدا گفتم این توقف آنی نیست) using System; using System.Linq; using System.Threading.Tasks; using System.Collections.Concurrent; namespace Parallel_TesTer { internal class Program { private static void Main(string[] args) { try {

اسكريپت PowerShell براي بكاپ گرفتن از فايل ها

از بانك هاي SQL بصورت منظم و با رعايت كردن استاندارد خاصي بكاپ گرفته ميشه تو بكاپ سرور براي موارد خاص قرار شد آخرين فول بكاپ در فولدري مجزا نگهداري بشه استاندارد نام گذاري فايل هاي بكاپ بصورت [نام بانك_FULL_تاريخ بكاپ_ساعت بكاپ] است ليست فايل ها $srcDir=Get-ChildItem D:\SQLServerBackup\ -Recurse تاريخ جاري سرور فقط تاريخ $curDate=get-date -Format D فايلهاي كه نام توسعه اونها بك و تاريخ ساختشون امروزه $srcList=$srcDir | where {$_.Extension -eq ".bak" -and $_.CreationTime.Date -eq $curDate} اگه ليست خالي نبود if($srcList.count) { فور ايچ معروف foreach ($fileItems in $srcList) { گر نام فايل شامل كلمه فول بود براي اينكه لاگ بكاپ ها رو رد كنيم كه استاندارد نام گذاريشون متفاوته if($fileItems.BaseName.Contains("_FULL")) { توليد آدرس مبدا و مقصد $srcNewName=$fileItems.DirectoryName+"\"+$fileItems چون قراره آخرين فول بكاپ نگهداري بشه قسمت تاريخ و زمان فايل رو حذف ميكنم تا آخرين فايل اور رايت (دوباره نويسي) بشه $des

نكاتي براي بهينه سازي Visual Studio 2010 – قسمت سوم

تصویر
در قسمت اول و دوم بيشتر نكاتي كه عنوان شد مربوط به بهينه سازي خود IDE بود در اين پست(بخش آخر 2 پست قبلي) نكاتي رو كه باعث بالارفتن سرعت Build شدن پروژه ميشه رو برسي ميكنيم   1-تعداد پروژه هاي كه بصورت همزمان(موازي) Build بشن رو افزايش بديد از مسير Tools > Options > Projects and Solutions قسمت Build and Run عدد maximum number of parallel builds رو افزايش بديد(عدد خاصي رو نميشه پيشنهاد داد. بستگي داره.من رو 8 گذاشتم) 2-ميزان(سطح) verbosity رو كاهش بديد از مسير Tools > Options > Projects and Solutions قسمت Build and Run مقدار MSBuild project build output verbosity رو روي Quiet بزاريد 3-اسكن فايلهاي با پسوند OBJ, LIB, ILK, PDB رو از AntiVirus تون خارج كنيد 4-براي پروژهاتون از يك فولدر يكسان استفاده كنيد براي مثال براي Debug روي نام پروژه راست كليك كنيد و از تب Build قسمت Output Path 5-مقداري رو كه در مورد بالا براي Output Path ست كرديد ميتونه يك فولدر رو يك درايو مجازي روي رم باشه + 6-اگه مورد 4 رو انجام داديد ميتونيد Copy Local = False ب

نكاتي براي بهينه سازي Visual Studio 2010 – قسمت دوم

تصویر
در ادامه پست   قبلي نكات زير هم ميتون كار با Visual Studio رو براي شما راحتر كنن 1-پروژه هاي رو كه در حال حاضر كاري روشون انجام نميديد رو Unload كنيد با راست كليك كردن رو نام پروژه گزينه Unload رو كيك كنيد 2-اگه رو فايل هاي پروژه خارج از Visual Studio كار نميكنيد متوجه شدن تغييرات خارج  از Visual Studio روي  فايل ها رو غير فعال كنيد از مسير Tools > Options > Environment > Documents تيك Detect when file is changed outside the environment رو برداريد 3-تو فولدر solution تون فايل مخفي با اكستنشن suo وجود داره كه options مربوطه به solution مربوطه داخلش ذخيره ميشه.پاكش كنيد تا سرعت لود شدن رو احساس كنيد   4-مانع اسكن شدن فولدرهاي مرتبط با Visual Studio بوسيله Antivirus بشيد (Exclude) 5-مورد بالا رو براي پراسس devenv.exe انجام بديد 6-از ايندكس شدن فولدرهاي پروژتون جلوگيري كنيد   7-در صورتي كه روي پروژه ويندوز فرمي كار ميكنيد قبل از بستن solution فرم هاي باز رو ببنديد 8-فرم ها رو تو پروژه هاي ويندوز فرمي در حالت C

نكاتي براي بهينه سازي Visual Studio 2010 – قسمت اول

تصویر
يكي از مشكلاتي كه تو نسخه 2010  نرم افزار Visual Studio خيلي محسوسه كندي اونه در ادامه چندين نكته كه ميتونه اين كندي رو كاهش بده ليست شده   1-حتما سرويس پك 1 رو نصب كنيد +   2-اگه OS تون 32 بيتيه و بيش از 2 گيگ رم داريد اين پست رو ببينيد   3-splash screen آغازين Visual Studio رو غير فعال كنيد (تستي كه خودم انجام دادم حدودا 7 ثانيه فرقش شد!!!) "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" /nosplash   4-صفحه آغازين Visual Studio  رو خالي قرار بديد از مسير Tools > Options > Environment > Startup مقدارShow empty environment  رو ست كنيد   5-اگه از سورس كنترلرTeam Foundation استفاده نميكنيد (توجه كنيد SVN تو اين بخش ليست نميشه پس نگران نباشيد) از مسير  Tools > Options > Source Control مقدار None رو ست كنيد   6-تو نسخه جديد  Visual Studio كه با WPF طراحي شده به صورت پيش فرض براي نمايش صفحات از hardware rendering استفاده ميشه  و اگه VGA شما مشكل داشته باشه يا آپديت نباشه باعث كندي ميشه و …   البته با روش زير

تست کردن وب سرویس ها با WCFStorm

تصویر
سناریو / مشکل : بعد از نوشتن وب سرویس و هاست کردن اون تو نت برای تست(فراخوانی) کردن ش باید یه پروژه تستی ایجاد و  وب سرویس هام رو تست کنم که کاری زمانبره راه حل: استفاده از WCFStorm نسخه مجانی و open source اونو میتونید از اینجا دریافت کنید برای اضافه کردن سرویس File --> Service –> Add و آدرس وب سرویس رو وارد کنید wcfstorm با خوندن متا دیتای وب سرویس متدهای اونو برای شما لیست میکنه میتونید از این وب سرویس برای تست استفاده کنید توجه :با روشی که اینجا برای از كار انداختن صفحه‌ي Add service reference در VS.NET  معرفی شده به احتمال زیاد wcfstorm نمیتونه کار کنه بعد از انتخاب متد مورد نظر لیست پارامترهای اون تو پنجره RequestPane لیست میشه یکی از نکات جالب wcfstorm پشتیبانی از نوع هایه پیچیدس ساختار CompositeType رو میتنونید تو شکل زیر ببینید برای مقدار دادن به پارامتر ها با کلیک کردن روی پارامتر مورد نظر تو پنجره ای که باز میشه قسمت Value مقدار مورد نظر رو وارد کنید بعد از زدن دکمه Send خروجی به این شکل میشه(متد تستی GetDataUsingContract ورودی رو بع

مقدمه ای بر Resource Governor در SQL Server 2008

تصویر
سناریو / مشکل : روي يك سرور هم نرم افزار ERP داريم و هم نرم افزار گزارش گيري چون نرم افزار گزارش گيري منابع بيشتري مصرف ميكنه نرم افزار ERP كه تو سازمان از اولويت بالايي برخوردارده كند ميشه راه حل: Resource Governor يك تكنولوژي جديد در SQL Server 2008 هست كه از طريق تعيين كردن محدوديت مصرف (استفاده) منابع ;بوسيله درخواست هاي ورودي به سرور بارهاي كاري(workloads) و منابع SQL Server رو مديريت میکنه. در سروري كه ما 2 (يا چند) بار کاری متمايز داريم براي مثال بار كاري نرم افزار ERP و بار كاري نرم افزار گزارش گيري Resource Governor بين اين 2 فرق قائل ميشه و مياد منابع مشترك درخواست شده(CPU و memory) رو براساس محدوديت هاي كه ما به ازاي هر باركاري مشخص كرديم به اون درخواست تخصيص ميده. در واقع ما ميايم براي يك باركاري مشخص اولويت در نظر ميگيرم در اينجا نرم افزار ERP و تضمين ميكنيم در شرايطي كه بين چند بار كاري متمايز بر سر يك Resource خاص رقابت بوجود اومد باركاري با اولويت بالا حتما پيروز بشه و درنتيجه كامل بشه.   براي مثال در شكل بالا 2 گروه كاري داريم و بسته به نياز و اهميت حدا

ملاحظات امنيتي در SQL Server Mixed Mode Authentication

قبل از هر چيز best practice مايكروسافت اينه كه تا جايي كه ممكنه از Windows authentication mode استفاده بشه اوكي خيلي هم خوب ولي در بيشتر مواقع مجبوريم كه از mixed mode authentication استفاده كنيم وقتي كه سرور رو نصب ميكنيد لاگين معروف و خطرناك SA بصورت پيش فرض ساخته  ميشه ولي وقتي كه شما سويچ ميكنيد به Windows authentication mode اين لاگين غيرفعال و پسوردي بصورت رندوم بهش اختصاص داده ميشه خوب اين كارا برا چيه !!؟ تقريبا اولين كاري كه يه يوزر كنجكاو براي دسترسي به sql server انجام ميده اينه SA 123 يا 1234 يا … چرا چون SA يه لاگين جنريكه و بصروت پيش فرض تو همه سرور ساخته شده و اينجاس كه خطر Brute Force  سرور مارو تهديد ميكنه خوب در Windows authentication mode  كه تكليفمون با SA مشخصه ميمونه  mixed mode authentication كه نكات امنيتي زير رو ميشه رعايت كرد 1-پسورد مناسب و قوي براي SA (اگه خيلي قوي بود كه خودتون هم گمش كرديد اين پست ميتونه كمكتون كنه) 1-1-حتما بصورت دورهاي لاگين شدن هاي ناموفق رو برسي كنيد(اين خواصيت بصورت پيش فرض رو سرور فعاله) EXEC sp_readerrorl

كار كردن با نوع Xml در linked server

هنگام كار كردن با Linked Server اگر جدول شما شامل ستوني از جنس Xml باشه كوئري زير SELECT T.ID , T.Name FROM [10.0.1.3].RemoteDatabase.[dbo].[Tbl_Person_Remote] AS T INNER JOIN LocalDatabase.[dbo].[Tbl_Person_Local] ON T.ID = LocalDatabase.[dbo].[Tbl_Person_Local].ID باعث خطاي زير ميشه Xml data type is not supported in distributed queries. براي رفع اين مشكل 2 راه  وجود داره   1-ساختن يك View در سرور ريموت كه شامل اون ستون Xml نباشه   2-استفاده از تابع OPENQUERY SELECT T.ID , T.NAME FROM OPENQUERY([10.0.1.3] , 'SELECT T.ID ,T.Name FROM RemoteDatabase.[dbo].[Tbl_Person_Remote]') AS T INNER JOIN LocalDatabase.[dbo].[Tbl_Person_Local] ON T.ID = LocalDatabase.[dbo].[Tbl_Person_Local].ID توجه كنيد من تو Select ام اون ستوني رو كه از جنس Xml هست ندارم در صورت نياز بايد اون ستون رو Cast يا Convert كنيد به NVARCHAR(max) مشكل ديگه اي كه ممكنه تو كوئري هاي از اين دست به اون بر بخوريد (Distributed Queries)  يكي

سازماندهي فايل هاي EXE با استفاده از AutoIt 3

تصویر
تو يكي از انجمن هاي مورد علاقم تاپيكي هست بنام “تاپیک تجربیات خاص !!” يكي از پست هاي اونجا اين بود هیچ وقت چیزهایی رو که از اینترنت میگیرید روی هم تلنبار نکنید ،و نگید که بعدا مرتب میکنم .بلکه سعی کنید بعد از دریافت اطلاعات بلافاصله اونها رو توی پوشه های مجزا و با نامهایی که براتون معنی دارن ذخیره کنید تا بعدا تو هچل پیدا کردن اونها نیفتید. دقيقا همينه براي مثال فايلي كه براي SQL Server Compact 4.0 دانلود ميشه اينه SSCERuntime_x86-ENU.exe خوب حالا فرض كنيد بعد چند وقت ميخواهيد دنبال SQL Server Compact 4.0 تو PC تون بگرديد و… بشخصه براي راحتي فولدري بنام SQL Server Compact 4.0 ميسازم و فايل مربوطه رو داخلش و اينجوري به فايلام سروسامون ميدم ولي انجام اين كار زمانبره دنبال روشي براي اتومات كردن اين پروسه بودم كه با AutoIt آشنا شدم AutoIt v3 يك زبان برنامه‌نويسي اسكريپتي است كه هدف از طراحي آن، خودكارسازي عمليات مربوط به پنجره‌هاي گرافيكي كاربر (GUI) و اسكريپت‌نويسي عمومي است. اين زبان تركيبي از قابليت‌هايي چون شبيه‌سازي ارسال keystroke به پنجره‌هاي هر برنامه‌ي دلخواه، حركت

دنباله اعداد در Denali

تصویر
دنباله اعداد يا Sequence Numbers ويژگي جديدي تو نسخه 2011 اسكيوال سرور(Denali)ه كه خيلي وقته تو Oracle وجود داشته. نظر بعضي‌ها هم در اين رابطه اين بوده! Oracle has had sequences since SQL Server was only a gleam in the eye of Mr. Gates. بر اساس تعريف ي كه تو Books on Line اومده sequence number "يك شي محدود به schema ي تعريف شده توسط كاربرهست كه برا اساس مشخصات ابتدايي ساختش دنباله ي از اعداد رو توليد ميكنه" براي ايجاد Sequence تستي از كد زير استفاده ميكنيم --ساختن اسكيما CREATE SCHEMA Test ; GO -- ساختن جدول CREATE TABLE Test.Orders (OrderID int PRIMARY KEY, Name varchar(20) NOT NULL, Qty int NOT NULL); GO -- ساختن دنباله CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO -- اضافه كردن ركورد INSERT Test.Orders (OrderID, Name, Qty) VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ; INSERT test.Orders (OrderID, Name, Qty) VALUES (NEXT VALUE FOR Test.CountBy1, 'Seat', 1) ; INSERT test.Orders (OrderID, Nam

جستجوي كاراكترهاي ويژه در SQL SERVER

در عبارت هاي جستجو كاراكترهاي خاصي وجود دارند كه به آنها wildcard ميگن يا كاراكترهاي جايگزين شونده حالا مشكلي كه در تمام عبارت هاي جستجو با اون روبرو هستيم جستجو كردن همون wildcard هاس فرض كنيد ميخواهيد كوئري بنويسيد كه تمامي  ركورد هاي كه شامل % هست رو برگردونه شايد اول روشي كه به فكر برسه  تكرار 2 باره % تو عبارت جستجو باشه ولي اين روش جواب نميده SELECT * FROM myTable WHERE myField LIKE '%%%%' در Sql Server  به 2 روش ميشه اين كار رو انجام داد استفاده از كروشه [] SELECT * FROM myTable WHERE myField LIKE '%[%]%' استفاده از عملگر ESCAPE SELECT * FROM myTable WHERE myField LIKE '%!%%' ESCAPE '!' تو اين روش با كاراكتر بعد از حرف ESCAPE (در اينجا !) مثل يك حرف معمولي رفتار ميشه نه wildcard  يا كاراكترهاي جايگزين شونده منابع: + و +

پاك كردن Node هاي تكراري Xml با استفاده از Linq

تصویر
فيد كاملي از وبلاگ هاي IT ايراني رو ميتونيد از اينجا   دانلود كنيد ولي مشكلي كه بشخصه با اين ليست دارم تكراري بودن بعضي فيدهاس (البته منطقا تكراري نيست) به شكل زير توجه كنيد خوب براي حذف كردن اين Node هاي تكراي از فايل OPML از LINQ استفاده ميكنيم براي اين كار از متد  Distinct استفاده ميكنيم ولي نكته اي كه اينجا هست ما ميخواهيم برا اساس فيلدي كه ما مشخص ميكنيم عمل Distinct انجام بشه براي اين كار بايد ما يك كلاس مجزا تعريف كنيم كه از EqualityComparer< T> Class  به ارث بره using System.Collections.Generic; namespace RemoveDuplicateNodes { public class Opml { public string Text { get; set; } public string Title { get; set; } public string Type { get; set; } public string XmlUrl { get; set; } public string HtmlUrl { get; set; } } public class OpmlCompare : EqualityComparer<opml> { public override bool Equals(Opml x, Opml y) { return x.HtmlUrl.Equals(y.HtmlUrl); }

مشكل OCR مترجم Babylon با Firefox 4 و IE9

تصویر
بعد از نصب Firefox 4 و IE9 مترجم Babylon ديگه كار نميكنه يكي از روش هاي رفع اين مشكل بيخيال شدن Babylon و استفاده از جايگزين هاي اونه بهترين جايگزين هم همونطور كه تو  سايت alternativeto.net   راي اورده Google Translate هست من بشخصه از افزونه گروه نرم افزاری مریم استفاد ميكنم روش دوم غيرفعال كردن  Clear Type ويندوز هستش براي اينكار تو قسمت RUN ويندوز cttune رو تايپ كنيد و… و آخرين روش اينه كه تكست مورد نظر رو highlight كنيد بعد Babylon  رو فعال كنيد نكته:اين روش تو Firefox خوب جواب ميده

باگ Remember Password در SSMS

تصویر
بعد از زدن تيك remember password در صفحه connect to server مشكل زير برام پيش ميومد   بعد از سرچ كردن متوجه شدم اين مشكليه كه از ورژن 2005  تو ssms هست .فقط چند نمونه از گزارش  اين مشكل  +   و  +   روشي رو اينجا معرفي كردن كه اين روش موقته و بعد از چند بار لاگين كردن به حالات اول برميگرده C:\Documents and Settings\[USERNAME]\Application Data\Microsoft\Microsoft SQL Server\100\Tools\Shell تو اين روش تمام history  سرور ها و … تو پنجره connect to server پاك ميشن توجه:تمامي تنظيمهاي شما تو SSMS پاك ميشه پس لازمه بعد از اين كار از آدرس زير دوباره تنظيمات رو اعمال كنيد Tools -> Options خوب ايناي كه گفتم نتيجه جستجوي من بود ولي خودم بعد از سعي و خط متوجه شدم دليل اين مشكل چيه(شايد اين باشه حداقل براي من دليلش اين بود) اين مشكل زماني بوجود مياد كه شما براي يك سرور چندين لاگين داريد  وبعد از زدن تيك remember password در صفحه connect to server اين مشكل بوجو مياد با استفاده از برنامه SC-PassUnleash متوجه شدم SSMS موقعي كه تيك remember password رو ميزنيم پسورد

بازكردن لينك هاي وبلاگ بلاگري در پنجره جديد

با تبريك سال نو و آرزوي سلامتي براي همه اولين پستم رو تو سال 90 ميزنم بعد از مشكلاتي كه براي بلاگر پيش اومد تصميم گرفتم دامنه اي براي ادامه فعاليتم تهيه كنم بنام dotnetdev.info اگر ديگر دوستان بلاگري هم قصد تهيه دامنه اختصاصي براي وبلاگشون رو دارن خوندن اين پست رو پيشنهاد ميكنم خوب از تبريك و معرفي كه بگذريم هنگام نوشتن پست خيلي پيش مياد كه به خودمون يا به ديگرون لينك ميديم مشكلي كه هست بصورت پيش فرض تمام لينك ها تو همون صفحه اي كه ما لينك داديم باز ميشه و كسي كه داره اين پيج رو ميخونه مجبوره دكمه Back رو بزنه تا بياد به صفحه ي كه اول بوده در يك كلام TARGET = "_self" براي رفع اين مشكل و باز شدن تمام لينك ها در پنجره جديد تغيير زير رو انجام بديد لاگين در Blogger Dashboard قسمت Design >> Edit HTML كد <head> رو با <head> <base target='_blank' /> جايگزين كنيد منبع: +

پیاده سازی استاندارد نام گذاری جداول SQL Server بوسیله Policy-Based Management

تصویر
تو پست قبلی مقدمه ای رو بر Policy-Based Management در SQL Server 2008 گفتم.تو این پس قصد دارم با یه مثال عملی یکی از کاربرد های Policy-Based Management  رو معرفی کنم. تو شرکت ما یکسری جدول بصورت استاندارد وجود داره ولی برای کارهای پشتیبانی و …نیاز به جداول موقت داریم.مشکلی که برای ما پیش اومده رعایت نکردن استاندارد نام گذاری این جداوله برای همین یه روی سرور یه Policy ایجاد کردم تا از ایجاد جداولی که استاندارد جداول موقت رو رعایت نکردن جلوگیری کنه. برای شروع باید اول یک Condition تعریف کرد.مسیرش رو تو شکل زیر میبینید برای ساخت Condition روی Conditions راست کلیک کرده و گزینه New Condition رو انتخاب میکنیم از مفاهیمی که تو پست قبلی گفتم تو این مثال  Target Type همون جداوله و Facet هم Table Options ه که شامل چندین خواص (Properties) هست که برای این مثال ما با خواصیت Name اون کار داریم. بعد ساخت Condition نوبت ساختنه Policy هست.برای اینکار روی Policies راست کلیک کرده و گزینه New Policy رو انتخاب میکنیم از مفاهیمی که تو پست قبلی گفتم تو این مثال Evaluation Mode یا نحوه ارزیابی ما on Change