مطالب
به روز رسانی ارجاعات یک اسمبلی دارای امضای دیجیتال بدون کامپایل مجدد

سؤال: امروز NHibernate به روز شده اما Fluent NHibernate خیر! چکار باید کرد؟!

Fluent NHibernate کتابخانه‌ای است جهت رهایی برنامه نویس‌ها از نوشتن فایل‌های XML نگاشت کلاس‌ها به جداول به همراه قابلیت‌های دیگری مانند نگاشت خودکار و غیره. بنابراین این کتابخانه بدون NHibernate اصلی بدون کاربرد است. تیم توسعه آن هم با تیم اصلی NHibernate یکی نیست. عموما NHibernate به روز می‌شود اما Fluent NHibernate ممکن است تا دو ماه بعد از آن هم به روز نشود. در این مواقع چه باید کرد؟

دو کار را می‌توان انجام داد:

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

System.IO.FileLoadException: Could not load file or assembly ‘nameOfAssembly’,
Version=specificVersion, Culture=neutral, PublicKeyToken=publicKey’ or one of it's dependencies.
The located assembly’s manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

حذف ارجاعات به NHibernate قدیمی و افزودن مجدد ارجاعات به فایل‌های جدید و کامپایل نهایی پروژه یک راه حل است.

ب) راه حل دیگر استفاده از ویژگی bindingRedirect است بدون دریافت سورس، حذف و افزودن ارجاعات و کامپایل مجدد:
  <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NHibernate"
publicKeyToken="aa95f207798dfdb4"
culture="neutral" />
<bindingRedirect oldVersion="3.0.0.4000"
newVersion="3.1.0.4000"/>
</dependentAssembly>
</assemblyBinding>
</runtime>


در این مثال، پس از افزودن تعاریف فوق به فایل config برنامه، به سادگی می‌توان از اسمبلی اصلی NHibernate دارای نگارش 3.1.0.4000 به جای اسمبلی قدیمی‌تر 3.0.0.4000 آن استفاده کرد (همان نگارشی که Fluent NHibernate ما بر اساس آن کامپایل شده) و دیگر نیازی هم به کامپایل مجدد پروژه‌ای که از یک اسمبلی قدیمی Fluent NHibernate استفاده می‌کند، نخواهد بود.

مطالب
قابلیت های جدید VisualStudio.NET 2012 - قسمت سوم
اگر شما در زمینه طراحی وب سایت و برنامه‌های کاربردی تحت وب فعالیت دارید حتماً با ابزارهایی مانند Firebug آشنا هستید. معمولاً فرآیند بررسی مشکلات رابط کاربری و موضوعات مشابه آن بصورت زیر بوده است:
 
 

توجه داشته باشید که یک صفحه وب که در مرورگر به نمایش در می‌آید، برآیند فایل‌های جاوا اسکریپت، شیوه نامه ها، User control ها، صفحات ASPX و Master Page‌ها و ... است. افزون بر این آنچه در مرورگر نمایش داده می‌شود با چیزی که ما در محیط طراحی (Visual Studio.NET (Design View  می‌بینیم متفاوت است.
تمام مشکلات و سختی‌های بالا دست به دست هم دادند تا در نسخه جدید نرم افزار Visual Studio.NET شاهد ابزار جادویی با عنوان Page Inspector باشیم.
این ابزار بصورت Real-time امکان نگاشت (mapping) عناصر موجود در نتیجه نهایی برنامه وب را با سورس کد مهیا می‌کند. بدین معنا توسط Page Inspector با حرکت ماوس روی عناصر صفحه در مرورگر، Visual Studio.NET بخشی را که آن عنصر را تولید کرده است (User Control, Master Page, View, و ...) نمایش می‌دهد و شما می‌توانید بلافاصله پس از اعمال تغییرات جدید بر روی سورس کد، نتیجه را روی مرورگر ببنید. البته عکس این موضوع نیز صادق است و شما می‌توانید با حرکت در سورس کد، نتیجه بصری و عناصر HTML ی که در نتیجه تولید می‌شوند را مشاهده کنید. (عناصر متناظر به حالت Select در می‌آیند.)
 

 
از دیگر قابلیت‌های این ابزار نمایش CSS‌های متناظر هر عنصر است. شما می‌توانید هر یک از قوانینی که در Style هر عنصر تعریف کرده اید را فعال و یا غیر فعال کنید. همچنین امکان ویرایش آن‌ها وحود دارد.
همچنین از طریق گزینه File می‌توان لیست تمام فایل‌های سورس صفحه را مشاهده کرد.
 

 
با وجود چنین ابزاری یقیناً داشتن دو مانیتور برای برنامه نویسان و توسعه دهندگان وب کاملاً حیاتی است. چراکه Visual Studio.NET به شما این امکان را می‌دهد تا Page Inspector را در یک مانیتور و نمای سورس را در مانیتور دیگر به نمایش در آورید.
 
نکته:
جهت استفاده از تمام امکانات این ابزار باید دستور زیر را در تگ appsettings فایل web.config اضافه کنید:
 <add key="VisualStudioDesignTime:Enabled" value="true" />
پیشنهاد می‌کنم برای درک بهتر این ابزار و آشنایی با آن ویدئو مربوطه در کانال 9  را از دست ندهید.
 
مطالب
افزودن SQL Server CE 4.0 به لیست توزیع مجدد در InstallShield 2010
در برنامه‌ی ساخت نصاب InstallShield، در قسمت افزودن بسته‌های نصبی برای برنامه‌ی ساخته شده


بسته‌ی نصب  SQL Server CE 3.5 SP2 وجود دارد:


اما برای برنامه‌های جدیدتر نیاز به افزودن بسته‌ی نصب دیتابیس SQL Server CE نسخه 4 است که با عدم وجود این بسته روبرو هستیم. در ادامه با نحوه‌ی افزودن این بسته‌ها آشنا خواهید شد.

اینگونه بسته‌ها در کنار برنامه‌ی ساخت نصاب و در پوشه‌ی SetupPrerequisites نگهداری شده و با نوع *.prq ذخیره می‌شوند. این نوع فایل‌ها از نوع xml هستند و در واقع یک نوع کار نگاشت را انجام می‌دهند. برای نمونه محتویات یکی از این فایل‌ها را در زیر می‌بینید:
<?xml version="1.0" encoding="UTF-8"?>
<SetupPrereq>
<conditions>
<condition Type="32" Comparison="2" Path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v3.5\ENU" FileName="DesktopRuntimeVersion" ReturnValue="3.5.8080.0"></condition>
</conditions>
<operatingsystemconditions>
<operatingsystemcondition MajorVersion="5" MinorVersion="0" PlatformId="2" CSDVersion="" ServicePackMajorMin="3"></operatingsystemcondition>
<operatingsystemcondition MajorVersion="5" MinorVersion="1" PlatformId="2" CSDVersion="" Bits="1" ProductType="1"></operatingsystemcondition>
<operatingsystemcondition MajorVersion="6" MinorVersion="0" PlatformId="2" CSDVersion="" Bits="1"></operatingsystemcondition>
<operatingsystemcondition MajorVersion="5" MinorVersion="2" PlatformId="2" CSDVersion="" Bits="1" ProductType="2|3"></operatingsystemcondition>
<operatingsystemcondition MajorVersion="6" MinorVersion="1" PlatformId="2" CSDVersion="" Bits="1"></operatingsystemcondition>
<operatingsystemcondition MajorVersion="6" MinorVersion="0" PlatformId="2" CSDVersion="" Bits="1" ProductType="2|3"></operatingsystemcondition>
</operatingsystemconditions>
<files>
<file LocalFile="&lt;ISProductFolder&gt;\SetupPrerequisites\SQL CE 3.5\SSCERuntime_x86-ENU.msi" URL="http://go.microsoft.com/fwlink/?LinkId=166085&amp;clcid=0x409" CheckSum="86AF6D36DFF214718DCD35D851249D3D" FileSize="0,3164160"></file>
</files>
<execute file="SSCERuntime_x86-ENU.msi" cmdline="/q /norestart" cmdlinesilent="/q /norestart" returncodetoreboot="1641,3010,4123" requiresmsiengine="1"></execute>
<properties Id="{A7C4B3C0-F3A0-426A-A043-E13DBA123E52}" Description="This prerequisite installs the Microsoft SQL Server Compact 3.5 SP2." AltPrqURL="http://saturn.installshield.com/is/prerequisites/microsoft sql ce 3.5 sp2.prq"></properties>
<behavior Reboot="2"></behavior>
</SetupPrereq>
کافیست به ازای هر نسخه‌ی 32 و یا 64 بیتی، فایل xml مورد نظر، با پسوند prq در پوشه‌ی SetupPrerequisites ذخیره شود.
برای نسخه 32 بیتی(Microsoft SQL CE 4.0 x86.prq ):
<?xml version="1.0" encoding="UTF-8"?>
<SetupPrereq>
    <conditions>
        <condition Type="32" Comparison="2" Path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v4.0\ENU" FileName="DesktopRuntimeVersion" ReturnValue="4.0.8482.1"></condition>
    </conditions>
    <operatingsystemconditions>
        <operatingsystemcondition CSDVersion="" Bits="1"></operatingsystemcondition>
    </operatingsystemconditions>
    <files>
        <file LocalFile=".\SSCERuntime_x86-ENU.exe" URL="http://download.microsoft.com/download/0/5/D/05DCCDB5-57E0-4314-A016-874F228A8FAD/SSCERuntime_x86-ENU.exe" CheckSum="0A55733CF406FBD05DFCFF5A27A0B4F7" FileSize="0,2379544"></file>
    </files>
    <execute file="SSCERuntime_x86-ENU.exe"></execute>
    <properties Id="{2754916B-119B-4428-9F94-DC9E45072CCC}"></properties>
    <behavior Failure="4" Reboot="2"></behavior>
</SetupPrereq>
و برای نسخه 64 بیتی(Microsoft SQL CE 4.0 x64.prq) : 
<?xml version="1.0" encoding="UTF-8"?>
<SetupPrereq>
    <conditions>
        <condition Type="32" Comparison="2" Path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v4.0\ENU" FileName="DesktopRuntimeVersion" ReturnValue="4.0.8482.1"></condition>
    </conditions>
    <operatingsystemconditions>
        <operatingsystemcondition CSDVersion="" Bits="2"></operatingsystemcondition>
    </operatingsystemconditions>
    <files>
        <file LocalFile=".\SSCERuntime_x64-ENU.exe" URL="http://download.microsoft.com/download/0/5/D/05DCCDB5-57E0-4314-A016-874F228A8FAD/SSCERuntime_x64-ENU.exe" CheckSum="A417082ECAEDD95AFB41F73DC140C350" FileSize="0,2621240"></file>
    </files>
    <execute file="SSCERuntime_x64-ENU.exe"></execute>
    <properties Id="{7CB7BE3C-614A-403F-94D9-5652285A3EDF}"></properties>
    <behavior Failure="4" Reboot="2"></behavior>
</SetupPrereq>
و در نهایت این دو بسته به لیست اضافه خواهد شد:



 
نظرات اشتراک‌ها
پیش نمایش Rider 2019.1
من این ide رو نصب کردم و از آن هرازگاهی استفاده میکنم، چندتا از ویزگیهاش(هم مثبت و هم منفی) که الان به ذهنم می‌رسه رو عرض می‌کنم:
1- توی لود پروژه هایی که تعداد فایل زیادی دارند خیلی کند هست. الان مدتی هست که روی یک پروژه روی asp.net mvc core 2 کار می‌کنم، تعداد فایلهای آن ذاتاً زیاد است، و چندتا پروژه اوپن سورس هم که بهش اضافه کردم تعداد فایل بیشتر هم شده و rider واقعاً در بحث لود کردن و ایندکسینگ بسیار کند عمل میکنه.(البته اگر هارد ssd داشته باشید فکر نکنم مشکلی باشه)
2- برای کسی که سالها با visual studio کار کرده برقراری ارتباط با آن کمی مشکل هست، مخصوصاً در بحث go to definition و ...
3-حتماً باید ram سیستم در حد مطلوب باشد، درسته حجم خود نرم افزار نسبت به vs بسیار کمه اما در زمان اجرا واقعاً رم بسیار زیادی می‌گیره.
4- گاهی خطاهایی در زمان debug میگیره که در visual studio اتفاق نمیافته
5- چون resharper رو ذاتاً در خودش داره توی refactoring و بهینه کردن کدها بسیار کمک میکنه.
6- بنده توی خطایابی و رفع خطاهای موجود در کدها در visual studio راحت‌تر هستم، مخصوصاً بعد از نصب ابزارهای roslyn به نظرم visual studio راحت‌تر عمل میکنه.
7- واقعاً find در visual studio نسبت به find این ide حرفی برای گفتن نداره، البته بنده گاهی که نیاز به جستجوی سریع و پیچیده دارم از هیچکدوم استفاده نمیکنم در این مواقع از sublime text استفاده میکنم
8- در زمینه کار با سیستمهای version control به نظرم هردو امکانات خوب و کاملی دارند، منتها به سبب عادت من با visual studio راحت ترم.
9- با همه اینها فکر میکنم اگر عادت کنیم rider یک ide قابل تحسینیه، و با بهبودهایی که خواهد داشت مطمئنا برای dotnet core یک ide پرطرفداری خواهد بود
مطالب
اصول طراحی شی گرا SOLID - #بخش اول اصل SRP
مخاطب چه کسی است؟
این مقاله برای کسانی در نظر گرفته شده است که حداقل پیش زمینه ای در مورد برنامه نویسی شی گرا داشته باشند.کسانی که تفاوت بین کلاس‌ها و اشیاء را میدانند و میتوانند در مورد ارکان پایه ای برنامه نویسی شی گرایی نظیر : کپسوله سازی (Encapsulation) ، کلاس‌های انتزاعی (Abstraction) ، چند ریختی (Polymorphism ) ، ارث بری (Inheritance) و... صحبت کنند.

مقدمه :
در جهان شی گرا ما فقط اشیاء را میبینیم که با یکدیگر در ارتباط هستند.کلاس ها، شی ها، ارث بری، کپسوله سازی ، کلاس‌های انتزاعی و ... کلماتی هستند که ما هر روز در حرفه‌ی خودمان بارها آنها را میشنویم.
در دنیای مدرن نرم افزار، بدون شک هر توسعه دهنده‌ی نرم افزار ،یکی از انواع زبان‌های شی گرا را برای استفاده انتخاب میکند. اما آیا او واقعا میداند که برنامه نویسی شی گرا به چه معنی است؟ آیا او واقعا از قدرت شی گرایی استفاده میکند؟
در این مقاله تصمیم گرفته ایم پای خود را فراتر از ارکان پایه ای برنامه نویسی شی گرا قرار دهیم و  بیشتر در مورد طراحی شی گرا صحبت کنیم.
طراحی شی گرا :
طراحی شی گرا یک فرایند از برنامه ریزی یک سیستم نرم افزاری است که در آن اشیاء برای حل مشکلات خاص با یکدیگر در ارتباط هستند. در حقیقت یک طراحی شی گرای مناسب ، کار توسعه دهنده را آسان میکند و یک طراحی نامناسب تبدیل به یک فاجعه برای او میشود.
هر کسی چگونه شروع میکند؟

وقتی کسانی شروع به ایجاد معماری نرم افزار میکنند، نشان میدهند که اهداف خوبی در سر دارند.آنها سعی میکنند از تجارب خود برای ساخت یک طراحی زیبا و تمیز استفاده کنند.  
 
اما با گذشت زمان، نرم افزار کارایی خود را از دست میدهد و بلااستفاده میشود. با هر درخواست ایجاد ویژگی جدید در نرم افزار ، به تدریج نرم افزار شکل خود را از دست میدهد و درنهایت ساده‌ترین تغییرات در نرم افزار موجب تلاش و دقت زیاد، زمان طولانی و مهمتر از همه بالا رفتن تعداد باگها در نرم افزار میشود.
چه کسی مقصر است؟
"تغییرات" یک قسمت جدایی ناپذیر از جهان نرم افزار هستند بنابراین ما نمتوانیم "تغییر" را مقصر بدانیم و در حقیقت این طراحی ما است که مشکل دارد.
یکی از بزرگترین دلایل مخرب کننده‌ی نرم افزار، تعریف وابستگی‌های ناخواسته و بیخود در قسمت‌های مختلف سیستم است. در این گونه طراحی‌ها ، هر قسمت از سیستم وابسته به چندین قسمت دیگر است ، بنابراین تغییر یک قسمت، بر روی قسمت‌های دیگر نیز تاثیر میگذارد و باعث این چنین مشکلاتی میشود. ولی در صورتی که ما قادر به مدیریت این وابستگی باشیم در آینده خواهیم توانست از این سیستم نرم افزاری به آسانی نگهداری کنیم.
 مثال: 

راه حل : اصول ، الگوهای طراحی و معماری نرم افزار
معماری نرم افزار به عنوان مثال MVC, MVP, 3-Tire به ما میگویند که پروژه‌ها از از چه ساختاری استفاده میکنند.
الگوهای طراحی یک سری راه حل‌های قابل استفاده‌ی مجدد را برای مسائلی که به طور معمول اتفاق می‌افتند، فراهم میکند. یا به عبارتی دیگر الگوهای طراحی راه کارهایی را به ما معرفی میکنند که میتوانند برای حل مشکلات کد نویسی بارها مورد استفاده قرار بگیرند.
اصول به ما میگوید اینها را انجام بده تا به آن دست پیدا کنی واینکه چطور انجامش میدهی به خودت بستگی دارد. هر کس یک سری اصول را در زندگی خود تعریف میکند مانند : "من هرگز دروغ نمیگویم" یا "من هرگز سیگار نمیکشم" و از این قبیل. او با دنبال کردن این اصول زندگی آسانی را برای خودش ایجاد میکند. به همین شکل، طراحی شی گرا هم مملو است از اصولی که به ما اجازه میدهد تا با طراحی مناسب مشکلاتمان را مدیریت کنیم.
آقای رابرت مارتین(Robert Martin) این موارد را به صورت زیر طبقه بندی کرده است :
1- اصول طراحی کلاس‌ها که SOLID نامیده می‌شوند.
2- اصول انسجام بسته بندی
3- اصول اتصال بسته بندی
در این مقاله ما در مورد اصول SOLID به همراه مثال‌های کاربردی صحبت خواهیم کرد.
SOLID مخففی از 5 اصول معرفی شده توسط آقای مارتین است:
S -> Single responsibility Principle
O-> Open Close Principle
L-> Liskov substitution principle
I -> Interface Segregation principle
D-> Dependency Inversion principle
اصل 1) S - SRP - Single responsibility Principle 
به کد زیر توجه کنید :
public class Employee
{
    public string EmployeeName { get; set; }
    public int EmployeeNo { get; set; }

    public void Insert(Employee e) 
    {
        //Database Logic written here
    }
    public void GenerateReport(Employee e)
    {
        //Set report formatting
    }
}
در کد بالا هر زمان تغییری در یک قسمت از کد ایجاد شود این احتمال وجود دارد که قسمت دیگری از آن مورد تاثیر این تغییر قرار بگیرد و به مشکل برخورد کنید. دلیل نیز مشخص است : هر دو در یک خانه‌ی مشابه و دارای یک والد یکسان هستند.
برای مثال با تغییر یک پراپرتی ممکن است متدهای هم خانه که از آن استفاده میکنند با مشکل مواجه شوند و باید این تغییرات را نیز در آنها انجام داد. در هر صورت خیلی مشکل است که همه چیز را کنترل کنیم.  بنابراین تنها تغییر موجب دوبرابر شدن عملیات تست میشود و شاید بیشتر.
اصل SRP برای رفع این مشکل میگوید "هر ماژول نرم افزاری میبایست تنها یک دلیل برای تغییر داشته باشد".
(منظور از ماژول نرم افزاری همان کلاس‌ها ، توابع و ... است و عبارت "دلیل برای تغییر" همان مسئولیت است.) به عبارتی هر شی باید یک مسئولیت بیشتر بر عهده نداشته باشد.  هدف این قانون جدا سازی مسئولیت­های چسبیده به هم است. به عنوان مثال کلاسی که هم مسئول ذخیره سازی و هم مسئول ارتباط با واسط کاربر است، این اصل را نقض می­کند و باید به دو کلاس مجزا تقسیم شود.  
 برای رسیدن به این منظور میتوانیم مثال بالا را به صورت 3 کلاس مختلف ایجاد کنیم :
1- Employee  : که حاوی خاصیت‌ها است.
2- EmployeeDB : عملیات دیتابیسی نظیر درج رکورد و واکشی رکوردها از دیتابیس را انجام میدهد.
3- EmployeeReport : وظایف مربوط به ایجاد گزارش‌ها را انجام میدهد.
کد حاصل :
public class Employee
{
    public string EmployeeName { get; set; }
    public int EmployeeNo { get; set; }
}

public class EmployeeDB
{
    public void Insert(Employee e) 
    {
        //Database Logic written here
    }
    public Employee Select() 
    {
        //Database Logic written here
    }
}

public class EmployeeReport
{
    public void GenerateReport(Employee e)
    {
        //Set report formatting
    }
}
این روش برای متد‌ها نیز صدق میکند به طوری که هر متد باید مسئولیت واحدی داشته باشد.
برای مثال قطعه کد زیر اصل SRP را نقض میکند :
//Method with multiple responsibilities – violating SRP
public void Insert(Employee e)
{     
    string StrConnectionString = "";       
    SqlConnection objCon = new SqlConnection(StrConnectionString); 
    SqlParameter[] SomeParameters=null;//Create Parameter array from values
    SqlCommand objCommand = new SqlCommand("InertQuery", objCon);
    objCommand.Parameters.AddRange(SomeParameters);
    ObjCommand.ExecuteNonQuery();
}
این متد وظایف مختلفی را انجام میدهد مانند اتصال به دیتابیس ، ایجاد پارامتر‌ها برای مقادیر، ایجاد کوئری و در نهایت اجرای آن بر روی دیتابیس.
اما با توجه به اصل SRP میتوان آن را به صورت زیر بازنویسی کرد :
//Method with single responsibility – follow SRP
public void Insert(Employee e)
{            
    SqlConnection objCon = GetConnection();
    SqlParameter[] SomeParameters=GetParameters();
    SqlCommand ObjCommand = GetCommand(objCon,"InertQuery",SomeParameters);
    ObjCommand.ExecuteNonQuery();
}

private SqlCommand GetCommand(SqlConnection objCon, string InsertQuery, SqlParameter[] SomeParameters)
{
    SqlCommand objCommand = new SqlCommand(InsertQuery, objCon);
    objCommand.Parameters.AddRange(SomeParameters);
    return objCommand;
}

private SqlParameter[] GetParaeters()
{
    //Create Paramter array from values
}

private SqlConnection GetConnection()
{
    string StrConnectionString = "";
    return new SqlConnection(StrConnectionString);
}
مسیرراه‌ها
ASP.NET MVC
              مطالب
              پردازش فایل‌های XML با استفاده از jQuery

              فرض کنید مثال دریافت اطلاعات API فیدبرنر را بخواهیم با استفاده از jQuery پیاده سازی کنیم، یعنی امکان برنامه نویسی سمت سرور را نداریم و می‌خواهیم با استفاده از جاوا اسکریپت، تعداد مشترکین فید یک سایت را نمایش دهیم.
              برای مثال آدرس دریافت اطلاعات مربوط به API فیدبرنر وبلاگ جاری به صورت زیر است:

              و در حالت کلی :
              http://api.feedburner.com/awareness/1.0/GetFeedData?uri=<feeduri>

              که حاصل آن برای مثال یک فایل XML با فرمت زیر می‌باشد:

              <rsp stat="ok">
              <feed id="fhphjt61bueu08k93ehujpu234" uri="vahidnasiri">
              <entry date="2009-01-23" circulation="153" hits="276" reach="10"/>
              </feed>
              </rsp>

              همانطور که مطلع هستید چند روزی است که jQuery 1.3.1 ارائه شده است. جهت استفاده از آخرین نگارش موجود آن تا این زمان، می‌توان از گوگل به عنوان هاست این کتابخانه به صورت زیر استفاده کرد:

              <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js' type='text/javascript'></script>

              نحوه خواندن مقدار circulation فایل xml ذخیره شده بر روی کامپیوتر:
              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
              <html>
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
              <title>FeedBurner API</title>
              <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js' type='text/javascript'>
              </script>
              <script type="text/javascript">
              function parseXml(xml){
              //find every entry and print the circulation
              $(xml).find("entry").each(function(){
              $("#output").append($(this).attr("circulation"));
              });
              }

              $(document).ready(function(){
              $.ajax({
              type: "GET",
              url: "GetFeedData_local.xml",
              dataType: "xml",
              success: parseXml
              });
              });
              </script>
              </head>
              <body>
              <div dir="rtl" style="font-family:tahoma; font-size:12px;">
              تعداد مشترکین تغذیه خبری سایت:
              <div id="output">
              </div>
              </div>
              </body>
              </html>

              با استفاده از قابلیت Ajax کتابخانه jQuery ، اطلاعات فایل محلی GetFeedData_local.xml دریافت شده و محتوای آن به تابع parseXml پاس می‌شود (توسط قسمت success). سپس در این تابع تمام تگ‌های entry یافت شده و مقدار circulation آن‌ها به یک div با ID معادل output اضافه می‌شود.
              مثال فوق در مورد خواندن اطلاعات از یک فایل xml می‌تواند برای مثال این کاربرد را در یک سایت داشته باشد:
              نمایش اتفاقی سخن روز یا سخن بزرگان و امثال آن بدون برنامه نویسی سمت سرور جهت انجام این کار از یک فایل xml تهیه شده، بدون نیاز به استفاده از دیتابیس خاصی.

              تا اینجای کار مشکلی نیست. اما همانطور که در مطلب مقابله با حملات CSRF نیز ذکر شد، مرورگرهای جدید امکان ارسال یا دریافت اطلاعات به صورت Ajax را بین سایت‌ها ممنوع کرده‌اند (ماجرا هم از آنجا شروع شد که یکبار جی‌میل این باگ امنیتی را داشته است). بنابراین اگر شما بجای url قسمت Ajax فوق، آدرس سایت فید برنر را قرار دهید با خطای زیر متوقف خواهید شد:

              Access to restricted URI denied

              تمام موارد دیگری هم که در jQuery برای دریافت اطلاعات از یک فایل یا url موجود است (مثلا تابع load یا get و امثال آن) فقط به سایت جاری و دومین جاری باید ختم شوند در غیر اینصورت توسط مرورگرهای جدید متوقف خواهند شد.

              نظرات مطالب
              Senior Developer به چه کسی گفته می شود؟
              توضیح خوبی بود، ولی از بین تمام این مطالب این قسمت از نظر شما به دلم نشست:
              در ضمن هنگام تهیه و مطالعه رزومه باید به عناوین تسلط و آشنایی و آگاهی دقت لازم را داشته باشیم. 
              خیلی از افراد کفر آدم رو در می‌آرن، ردیف کرده کلی تخصص حتی بدون تفکیک و شاخه بندی. جالب اینه که در همه زمینه‌ها هم اصطلاح تسلط رو به کار برده. من خودم به شخصه تسلط بر یک مبحث رو خیلی اصطلاح سنگین و دشواری میبینم. چون واقعا برای شایسته این اصطلاح بودن باید در سطح آگاهی و آشنایی نباشیم، باید در سطحی باشیم که چندین و چند بار از این اطلاعات و آگاهی‌ها در عمل استفاده کرده باشیم. به نظر من کلاس‌های آموزشی و مطالعه کتاب و بسیاری از موارد دیگر تنها ما رو به سطح آشنایی می‌رسانند ولی بدون استفاده عملی و کاربردی از اطلاعات در همین سطح باقی میمونیم و به تسلط بر آن موضوع دست پیدا نمی‌کنیم.
              با این تفاسیر متاسفانه کارفرمایان بین این واژه‌ها تفاوت چندانی قائل نمیشوند و بیشتر به اصطلاحات دهن پر کن توجه میکنند که البته در طولانی مدت هم با مشکل مواجه خواهند شد.
              بگذارید با یک مثال ملموس این قضیه رو روشن کنم:
              یادتون بیارید زمانی که تازه با کامپیوتر آشنا شدید، نصب نرم افزارهای کاربردی کوچک همیشه برای شما سورپرایزی داشته اند یعنی ممکنه برای نصب بعضی از نرم افزارها با مشکل مواجه شده باشید، شما در اینترنت و یا کتاب به دنبال راه حلی برای نصب آن نرم افزار بودید، تا اینجا در مرحله آگاهی قرار دارید، یعنی می‌دانید که نصب نرم افزار فرایندی بدون خطا نیست، شاید یه جاهایی با مشکل مواجه بشید که به راحتی نتونید حل کنید.
              بعد از مدتی که این روند تکرار میشه آگاهی‌های شما تعمیم پیدا میکنه و به سطح آشنایی میرسه، دیگه نصب نرم افزار‌ها برای شما استرس و مشکلات پیش بینی نشده ای نداره. شما اکنون در مرحله آشنایی هستید.
              الان در چه مرحله ای هستید؟ یقینا در سطح تسلط هستید، امکان نداره نصب مشکلترین نرم افزارها الان برای شما در بدترین حالت بیشتر از 1 ساعت طول بکشه. دیگه حتی به حدی رسیدید که دکمه Next‌و پذیرفتن لایسنز و محل نصب نرم افزار و ... جز روتین کار شده و مکثی روی این موارد ندارید.
              شما الان می‌تونید بگید که من به نصب نرم افزارها تسلط کامل دارم.
              آیا در زمینه Design pattern‌ها هم به همین صورت هستید؟ آیا در زمینه آزمایش واحد هم به همین صورت هستید؟ آیا استفاده از فلان الگوی طراحی به اندازه استفاده از حلقه For و کاربردش در ذهنتون قرار گرفته؟ آیا به اندازه با الگوی‌های طراحی کار کردید که در موقعیت‌های خاص ناخوداگاه به یاد استفاده از فلان الگوی طراحی بیفتید؟
              اگر پاسخ این سولات مثبته شما واقعا به الگوی‌های طراحی مسلط هستید؟
              اگر نیاز به کمی مکث و آزمون و خطا دارید، شما به الگوی‌های طراحی آشنا هستید؟
              اگر فقط می‌دونید که برای فلان مسئله الگوی طراحی کاربرد داره و بتونید فلان کد رو که از الگوی طراحی استفاده کرده تا حدودی تحلیل کنید،‌شما به الگوی‌های طراحی آگاهی دارید.

              پس به قول آقای پاکدل بین این سه مفهوم لطفا تفاوت قائل بشید.
              مطالب
              مدیریت تغییرات در سیستم های مبتنی بر WCF
              تشریح مسئله : در صورتی که بعد از انتشار برنامه؛ در نسخه بعدی مدل سمت سرور تغییر کرده باشد و امکان بروز رسانی مدل‌های سمت کلاینت وجود نداشته باشد برای حل این مسئله بهترین روش کدام است.
              نکته : برای فهم بهتر مطالب آشنایی اولیه با مفاهیم WCF الزامی است.
              ابتدا مدل زیر را در نظر بگیرید:
                 [DataContract]
                  public class Book 
                  {
                      [DataMember]
                      public int Code { get; set; }
              
                      [DataMember]
                      public string Name { get; set; }             
                  }
              حالا یک سرویس برای دریافت و ارسال اطلاعات این مدل به کلاینت می‌نویسیم.
                [ServiceContract]
                  public interface ISampleService
                  {
                      [OperationContract]
                      IEnumerable<Book> GetAll();
              
                      [OperationContract]
                      void Save( Book book );
                  }
              و سرویسی که Contract بالا رو پیاده سازی کند.
              public class SampleService : ISampleService
                  {
                      public List<Book> ListOfBook 
                      {
                          get; 
                          private set; 
                      }
              
                      public SampleService()
                      {
                          ListOfBook = new List<Book>();
                      }
                      public IEnumerable<Book> GetAll()
                      {
                          ListOfBook.AddRange( new Book[] 
                          {
                              new Book(){Code=1 , Name="Book1"},
                              new Book(){Code=2 , Name="Book2"},
                          } );
                          return ListOfBook;
                      }
              
                      public void Save( Book book )
                      {
                          ListOfBook.Add( book );
                      }
                  }
               متد GetAll برای ارسال اطلاعات به کلاینت و متد Save نیز برای دریافت اطلاعات از کلاینت.
              حالا یک پروژه Console Application بسازید و از روش AddServiceReference سرویس مورد نظر را به Client اضافه کنید. برنامه را تست کنید. بدون هیچ مشکلی کار می‌کند.
              حالا اگر در نسخه بعدی سیستم مجبور شویم به مدل Book یک خاصیت دیگر به نام Author را نیز اضافه کنیم و امکان Update کردن سرویس در سمت کلاینت وجود نداشته باشد چه اتفاقی خواهد افتاد.
              به صورت زیر:
               [DataContract]
                  public class Book 
                  {
                      [DataMember]
                      public int Code { get; set; }
                      [DataMember]
                      public string Name { get; set; }
              
                      [DataMember]
                      public string Author { get; set; }
                  }
              به طور پیش فرض اگر در DataContract‌های سمت سرور و کلاینت اختلاف وجود داشته باشد این موارد نادیده گرفته می‌شوند. یعنی همیشه مقدار خاصیت Author برابر null خواهد بود.
              نکته : برای Value Type‌ها مقادیر پیش فرض و برای Reference Type‌ها مقدار Null.
              اگر برای DataMemberAttribute خاصیت IsRequired را برابر true کنیم از این پس برای هر درخواستی که مقدار Author  آن مقدار نداشته باشد یک Protocol Exception  پرتاب می‌شود. به صورت زیر:
              [DataMember( IsRequired = true )]
              public string Author { get; set; }
              اما این همیشه راه حل مناسبی نیست.
              روش دیگر این است که Desrialize کردن مدل را تغییر دهیم. بدین معنی که هر گاه مقدار Author برابر Null بود یک مقدار پیش فرض برای آن در نظر بگیریم. این کار با نوشتن یک متد و قراردادن OnDeserializingAttribute به راحتی امکان پذیر است. کلاس Book به صورت زیر تغییر می‌کند.
                [DataContract]
                  public class Book
                  {
                      [DataMember]
                      public int Code { get; set; }
                      [DataMember]
                      public string Name { get; set; }
              
                      [DataMember( IsRequired = true )]
                      public string Author { get; set; }
              
                      [OnDeserializing]
                      private void OnDeserializing( StreamingContext context )
                      {
                          if ( string.IsNullOrEmpty( Author ) )
                          {
                              Author = "Masoud Pakdel";
                          }
                      }
                  }
              حال اگر از سمت کلاینت کلاس Book دریافت شود که مقدار خاصیت Author آن برابر Null باشد توسط متد OnDeserializing مقدار پیش فرض به آن اعمال می‌شود.مثل تصویر زیر:

              روش بعدی استفاده از اینترفیس IExtensibleDataObject  است. بعد از اینکه کلاس Book این اینترفیس را پیاده سازی کرد مشکل Versioning Round Trip حل می‌شود. به این صورت که سرویس یا کلاینتی که نسخه قدیمی را می‌شناسد اگر نسخه جدید را دریافت کند خصوصیاتی را که نمی‌شناسد مثل Author در خاصیت ExtensionData ذخیره می‌شود و هنگامی که کلاس Book برای سرویس یا کلاینتی که نسخه جدید را می‌شناسد DataContractSerializer اطلاعات مورد نظر را از خصوصیت ExtensionData بیرون می‌کشد و کلاس Book جدید را باز سازی می‌کند. بررسی کلاس ExtensionData توسط خود DataContractSreializer انجام می‌شود و نیاز به هیچ گونه ای کد نویسی ندارد.

              [DataContract]
                  public class Book : IExtensibleDataObject
                  {
                      [DataMember]
                      public int Code { get; set; }
                      [DataMember]
                      public string Name { get; set; }
              
                      [DataMember]
                      public string Author { get; set; }
                  
                      public virtual ExtensionDataObject ExtensionData
                      {
                          get { return _extensionData; }
                          set
                          {
                              _extensionData = value;
                          }
                      }
                      private ExtensionDataObject _extensionData;
                  }
              اگر کد متد GetAll سمت سرور را به صورت زیر تغییر دهیم که خاصیت Author هم مقدار داشته باشد با استفاده از خاصیت ExtensionData کلاینت هم از این مقدار مطلع خواهد شد.
              public IEnumerable<Book> GetAll()
                      {
                          ListOfBook.AddRange( new Book[] 
                          {
                              new Book(){Code=1 , Name="Book1", Author="Masoud Pakdel"},
                              new Book(){Code=2 , Name="Book2" },
                          } );
                          return ListOfBook;
                      }
              کلاینت هم به صورت زیر :

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

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

               [ServiceBehavior( IgnoreExtensionDataObject = true )]
                public class SampleService : ISampleService
              از این پس سرویس بالا از همان مدل Book بدون خاصیت Author استفاده می‌کند.

              منابع :
              اشتراک‌ها
              بیانیه Software Craftsmanship
              بیانیه صنعتگران نرم افزار، در جهت تولید سیستم‌های کارآمد تر، سازگارتر و قویتر(صرف نظر از خواسته‌های کاربران ) توسط بزرگان این حوزه صادر شده است و  توسعه دهندگان نرم افزار از سراسر جهان با مطالعه و اجرای بند‌های چهار گانه آن(در صورت اشتراک نظر) کمک به پیشرفت این جامعه بزرگ می‌نماید.
               این بیانیه رو توسط افراد زیادی مطالعه و امضا شده است.
              بیانیه Software Craftsmanship