اشتراک‌ها
آیا سیستم و شبکه شما در برابر تروجان جدید واناکرای ایمن است؟

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

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

بنابراین بهترین راهکار پیشگیری قبل از درمان است. به روز رسانی MS17-010 را حتما انجام دهید. حتی اگر Auto Update ویندوز شما فعال است این کار را به صورت دستی انجام دهید. دیده شده است که در برخی از سیستم‌ها حتی با وجود فعال بودن Auto Update این آپدیت حیاتی(Critical) نصب نشده است. آنتی ویروس خود را به روز نمایید. از اطلاعات خود بر روی یک درایو اکسترنال پشتیبان تهیه نمایید. 

آیا سیستم و شبکه شما در برابر تروجان جدید واناکرای ایمن است؟
بازخوردهای پروژه‌ها
نکته‌ای برای کامپایل پروژه در VS 2010
این پروژه بدون مشکل در VS 2010 کامپایل می‌شود اگر فایل sln آن اندکی ویرایش شده و Format Version آن 11 شود.
سپس یک نکته: اگر حین کامپایل این پروژه به خطای زیر برخوردید (خصوصا در VS2010 البته):
 Assembly 'Iris.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
uses 'System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
which has a higher version than referenced assembly
'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
این خطا مربوط است به تنظیم زیر:
 <MvcBuildViews>true</MvcBuildViews>
از این جهت که یک سری از وابستگی‌های این پروژه هنوز از MVC3 استفاده می‌کنند مانند:
 Reference: System.Web.Mvc
 4.0.0.0 by CaptchaMvc
 3.0.0.0 by Elmah.Mvc
 4.0.0.0 by Iris.DomainClasses
 4.0.0.0 by Iris.Model
 4.0.0.0 by Iris.Web
 3.0.0.0 by Iris.Web
 3.0.0.0 by LowercaseRoutesMVC
 3.0.0.0 by LowercaseRoutesMVC4
 3.0.0.0 by MiniProfiler
 3.0.0.0 by MvcSiteMapProvider
 3.0.0.0 by T4MVCExtensions
این لیست توسط برنامه AsmSpy تولید شده. (شماره نگارش‌های این لیست متناظر هستند با شماره نگارش System.Web.Mvc استفاده شده در اسمبلی متناظر)

راه حل:
وب کانفیگ را باز کنید و چند سطر ذیل را به مدخل compilation اضافه نمائید:

    <compilation debug="true" targetFramework="4.0" >
      <assemblies>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
      </assemblies>
    </compilation>
به علاوه قسمت assemblyBinding آن نیز، به نحو زیر نیاز به اصلاح دارد. فرقی هم نمی‌کند که از چه نگارشی استفاده می‌کنید (باید به MVC4 ارتقاء داده شود):

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
           <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
           <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />             
      </dependentAssembly>
      <dependentAssembly>
           <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
           <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="4.0.0.0" />             
      </dependentAssembly>
      <dependentAssembly>
           <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
           <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />             
      </dependentAssembly>
      <dependentAssembly>
           <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
           <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.3.0" newVersion="3.0.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

بازخوردهای پروژه‌ها
طراحی رابط کاربری - راهنمایی فنی
سلام و عرض تشکر
از دیروز دارم از این پروفایلر استفاده میکنم. عالی و بدون دردسر.
واقعا لذت بردم و چندجا از برنامه م رو بهبود دادم با این ابزار.
- سوالی داشتم در مورد تگ پیش پردازنده ای که توی کانفیگ برنامه اضافه میکنیم. آیا این تگ برای انتشار نهایی باید دستی پاک بشه؟ آیا مشکل کارایی رخ نمیده؟ آیا اساسا در مورد برنامه‌های وبی که روی هاست منتشر میکنیم، لاگ کردن با پروفایلر ارزش افزوده ای داره؟
- در مورد رابط کاربری، برام خیلی گنگ بود. مخصوصا اسکرول‌های تودرتو کار مرور اطلاعات رو واقعا مشکل میکرد. نرم افزار مشابه Entity Framework Profiler 3.0  رو که نگاه میکردم، از لحاظ بصری و پیدا کردن مطلب خیلی راحت‌تر بود. البته نرم افزار شما رایگان هست و این صرفا یک بازخورد در جهت بهبود و نه یک انتظار می‌باشد. با تشکر بسیار
نظرات اشتراک‌ها
Bulk delete و Bulk update در Entity framework
ممنون از راهنمای شما. بعد از مراجعه به آدرسی که داده بودید متوجه شدم برای سایرین هم این مشکل بوجود اومده و گزارش شده بود، بنابراین کاملا از روی پروژه‌ها و هارد دیسک حذفش کردم و مجدداً اقدام به دیافت آخرین نسخه کردم.
نسخه قبلی که گرفته بودم EntityFramework.Extended.6.0.0.86  بود ونسخه فعلی که کلیه مشکلات در اون مرتفع شده EntityFramework.Extended.6.1.0.95 هستش که نرم افزار بدون هیچ مشکلی راه اندازی شد.
اشتراک‌ها
امکانات جدید SQL Server 2017 -پیوند بانک اطلاعاتی رابطه ای و هوش مصنوعی

مایکروسافت که در نسخه ۲۰۱۶ این نرم افزار با افزودن امکان اجرای برنامه‌های R  و نیز تکمیل امکان اتصال به هدوپ و نیز قابلیت ذخیره و جستجوی داده‌های JSON یک گام بلند به سمت ایجاد یک بستر همه منظوره تحلیل داده برداشته بود، با امکانات جدیدی که در نسخه ۲۰۱۷ به مجموعه SQL Server اضافه کرده است، آنرا به یک گزینه مناسب و جامع برای کارهای تراکنش محور و نیز تحلیلی تبدیل کرده است 

امکانات جدید SQL Server 2017 -پیوند بانک اطلاعاتی رابطه ای و هوش مصنوعی
مطالب
آشنایی با ساختار IIS قسمت اول
در مقاله قبل در مورد نحوه ذخیره سازی در حافظه نوشتیم و به user mode و kernel mode اشاراتی کردیم که می‌توانید به آن رجوع کنید.
در این سری مقالات قصد داریم به بررسی اجزا و روند کاری موجود در IIS بپردازیم که چگونه IIS کار می‌کند و شامل چه بخش هایی می‌شود. مطمئنا آشنایی با این بخش‌ها در روند شناسایی رفتارهای وب اپلیکیشن‌ها و واکنش‌های سرور، کمک زیادی به ما خواهد کرد. در اینجا نسخه IIS7 را به عنوان مرجع در نظر گرفته‌ایم.
وب سرور IIS در عبارت مخفف Internet information services به معنی سرویس‌های اطلاعاتی اینترنت می‌باشد. IIS شامل کامپوننت‌های زیادی است که هر کدام ازآن‌ها کار خاصی را انجام میدهند؛ برای مثال گوش دادن به درخواست‌های ارسال شده به سرور، مدیریت فرآیندها Process و خواندن فایل‌های پیکربندی Configuration؛ این اجزا شامل protocol listener ،Http.sys و WSA و .. می‌شوند.
Protocol Listeners
این پروتکل‌ها به درخواست‌های رسیده گوش کرده و آن‌ها را مورد پردازش قرار می‌دهند و پاسخی را به درخواست کننده، ارسال می‌کنند. هر listener بر اساس نوع پروتکل متفاوت هست. به عنوان مثال کلاینتی، درخواست صفحه‌ای را می‌کند و http listener که به آن Http.sys می‌گویند به آن پاسخ می‌دهد. به طور پیش فرض http.sys به درخواست‌های http و https گوش فرا می‌دهد، این کامپوننت از IIS6 اضافه شده است ولی در نسخه 7 از SSL نیز پشتیبانی می‌کند.
Http.sys یا Hypertext transfer protocol stack
کار این واحد در سه مرحله دریافت درخواست، ارسال آن به واحد پردازش IIS و ارسال پاسخ به کلاینت است؛ قبل از نسخه 6 از Winsock یا windows socket api  که یک کامپوننت user-mod بود استفاده می‌شد ولی Http.sys یک کامپوننت Kernel-mod هست.

Http.sys مزایای زیر را به همراه دارد:

  • صف درخواست مد کرنل: به خاطر اینکه کرنل مستقیما درخواست‌ها را به پروسه‌های مربوطه میفرستد و اگر پروسه موجود نباشد، درخواست را در صف گذاشته تا بعدا پروسه مورد نظر آن را از صف بیرون بکشد.
  • برای درخواست‌ها یک پیش پردازش و همچنین اعمال فیلترهای امنیتی اعمال می‌گردد. 
  • عملیات کش کردن تماما در محیط کرنل مد صورت می‌گیرد؛ بدون اینکه به حالت یوزرمد سوییچ کند. مد کرنل دسترسی بسیار راحت و مستقیمی را برای استفاده از منابع دارد و لازم نیست مانند مد کاربر به لایه‌های زیرین، درخواست کاری را بدهد؛ چرا که خود مستقیما وارد عمل می‌شود و برداشته شدن واسط در سر راه، موجب افزایش عمل caching می‌شود. همچنین دسترسی به کش باعث می‌شود که مستقیما پاسخ از کش به کاربر برسد و توابع پردازشی در حافظه بارگذاری نشوند. البته این کش کردن محدودیت هایی را هم به همراه دارد:
    1. کش کرنل به صورت پیش فرض بر روی صفحات ایستا فعال شده است؛ نه برای صفحاتی با محتوای پویا که البته این مورد قابل تغییر است که نحوه این تغییر را پایینتر توضیح خواهیم داد.
    2. اگر آدرس درخواستی شامل کوئری باشد صفحه کش نخواهد شد:    http://www.site.info/postarchive.htm?id=25 
    3. برای پاسخ ازمکانیزم‌های فشرده سازی پویا استفاده شده باشد مثل gzip کش نخواهد شد
    4. صفحه درخواست شده صفحه اصلی سایت باشد کش نخواهد شد :   http://www.dotnettip.info ولی اگر درخواست بدین صورت باشه http://www.domain.com/default.htm  کش خواهد کرد.
    5. درخواست به صورت ناشناس anonymous نباشد  و نیاز به authentication داشته باشد کش نخواهد شد (یعنی در هدر شامل گزینه authorization می‌باشد).
    6. درخواست باید از نوع نسخه http1 به بعد باشد.
    7. اگر درخواست شامل Entity-body باشد کش نخواهد کرد.
    8. درخواست شامل If-Range/Range header باشد کش نمی‌شود.
    9. کل حجم response بییشتر از اندازه تعیین شده باشد کش نخواهد گردید، این اندازه در کلید ریجستری UriMaxUriBytes قرار دارد. اطلاعات بیشتر
    10. اندازه هدر بیشتر از اندازه تعیین شده باشد که عموما اندازه تعیین شده یک کیلو بایت است.
    11. کش پر باشد، کش انجام نخواهد گرفت.
    برای فعال سازی کش کرنل راهنمای زیر را دنبال کنید:
    گزینه output cache را در IIS، فعال کنید و سپس گزینه Add را بزنید. کادر add cache rule که باز شود، از شما میخواهد یکی از دو نوع کش مد کاربر و مد کرنل را انتخاب کنید و  مشخص کنید چه نوع فایل‌هایی (مثلا aspx) از این قوانین پیروری کنند و مکانیزم کش کردن به سه روش جلوگیری از کش کردن، کش زمان دار و کش بر اساس آخرین تغییر فایل انجام گردد.


    برای تعیین مقدار سایز کش response که در بالا اشاره کردیم می‌توانید در همان پنجره، گزینه edit feature settings را انتخاب کنید.


    این قسمت از مطلب که به نقل از مقاله  آقای Karol Jarkovsky در این آدرس است یک سری تست هایی با نرم افزار(Web Capacity Analysis Tool (WCAT  گرفته است که به نتایج زیر دست پیدا کرده است:
    Kernel Cache Disabled    4 clients/160 threads/30 sec      257 req/sec
    Kernel Cache Enabled     4 clients/160 threads/30 sec      553 req/sec 
    همانطور که می‌بینید نتیجه فعال سازی کش کرنل پاسخ به بیش از دو برابر درخواست در حالت غیرفعال آن است که یک عدد فوق العاده به حساب میاد.
    برای اینکه خودتان هم تست کرده باشید در این آدرس  برنامه را دانلود کنید و به دنبال فایل request.cfg بگردید و از صحت پارامترهای server و url اطمینان پیدا کنید. در گام بعدی 5 پنجره خط فرمان باز کرده و در یکی از آن‌ها دستور netsh http show cachestate را بنویسید تا تمامی وروردی‌های entry که در کش کرنل ذخیره شده اند لیست شوند. البته در اولین تست کش را غیرفعال کنید و به این ترتیب نباید چیزی نمایش داده شود. در همان پنجره فرمان wcctl –a localhost –c config.cfg –s request.cfg  را زده تا کنترلر برنامه در وضعیت listening قرار بگیرد. در 4 پنجره دیگر فرمان wcclient localhost از شاخه کلاینت را نوشته تا تست آغاز شود. بعد از انجام تست به شاخه نصب کنترلر WCAT رفته و فایل log را بخوانید و اگر دوباره دستور نمایش کش کرنل را بزنید باید خالی باشد. حالا کش را فعال کنید و دوباره عملیات تست را از سر بگیرید و اگر دستور netsh را ارسال کنید باید کش کرنل دارای ورودی باشد.
    برای تغییرات در سطح http.sys می‌توانید از ریجستری کمک بگیرید. در اینجا تعداد زیادی از تنظیمات ذخیره شده در ریجستری برای http.sys لیست شده است.
    نظرات مطالب
    ایجاد سرویس چندلایه‎ی WCF با Entity Framework در قالب پروژه - 9
    راه حلی که بنده پیدا کردم؛ تغییراتی در مقدار سایز پیام دریافتی به شکل زیر در appConfig مربوط به پروژه WinApp از این شکل :
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IMyNewsService" />
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:4636/SedaService.svc" binding="basicHttpBinding"
                    bindingConfiguration="BasicHttpBinding_IMyNewsService" contract="MyNewsService.IMyNewsService"
                    name="BasicHttpBinding_IMyNewsService" />
            </client>
        </system.serviceModel>
    </configuration>
    به این شکل تغییر دهید :
    <bindings>
                <basicHttpBinding>
                    <binding maxReceivedMessageSize="2147483647" name="BasicHttpBinding_IMyNewsService" />
                </basicHttpBinding>
            </bindings>
    حالا امنیت رو نمیدونم اینجا نقض کردم یا نه؟ لطفا اگر اطلاعاتی دارید راهنمایی بفرمایید که امنیت نقض شده یا نه؟ و کلا با یه عدد این شکلی که Max رو مشخص می‌کنه بنظرم نسبت به آینده نگری یک نرم افزار تجاری منطقی نیست...
    اشتراک‌ها
    لیست استان ها / شهرستان ها و شهر های ایران به همراه مختصات سال 97

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

    برای یکی از نرم افزارها نیاز بود  لیست به روز (سال 96-97) شهر‌های ایران رو به تفکیک استان/شهرستان/شهر به همراه مختصات آنها برای نمایش روی نقشه به صورت اطلاعات پایه در نرم افزار داشته باشیم... این شد که این فایل رو با توجه به دیتای سایت آمار کشور و چند سایت دیگر جمع آوری کردیم. 

    در نهایت این لیست رو به فرمت json به اشتراک گذاشتم تا دوستان هم اگر نیازی داشتند استفاده کنند.

    لیست استان ها / شهرستان ها و شهر های ایران به همراه مختصات سال 97
    مطالب
    بارگذاری UserControl در WPF به کمک الگوی MVVM
    در نرم افزارهای تحت ویندوز روشها و سلیقه‌های متفاوتی برای چینش فرمها ، منو‌ها و دیگر اجزای برنامه وجود دارد. در یک نرم افزار اتوماسیون اداری که فرمهای ورود اطلاعات زیادی دارد فضای کافی برای نمایش همه‌ی فرم‌ها به کاربر نیست. یکی از روش هایی که می‌تواند به کار رود تقسیم قسمت‌های مختلف نرم افزار در View‌های جداگانه است. این کار استفاده‌ی مجدد از قسمت‌های مختلف و نگهداری کد را سهولت می‌بخشد. 

    الگوی متداولی که در نرم افزار‌های WPF و Silverlight استفاده می‌شود الگوی MVVM است. (این الگو در جاوااسکریپت هم به سبب Statefull بودن استفاده می‌شود.) قبلا مطالب زیادی در این سایت جهت آموزش و توضیح این الگوی منتشر شده است.
    فرض کنید نرم افزار از چند بخش تشکیل شده :

    • صفحه‌ی اصلی
    • منو
    • یک صفحه‌ی خوش آمدگویی
    • صفحه‌ی ورود و نمایش اطلاعات
    می توان اجزا و تعریف هر یک از این قسمت‌ها را در یک UserControl قرار داد و در زمان مناسب آن را بارگذاری کرد. 
    سوالی که مطرح است بارگذاری UserControl‌ها به کمک الگوی MVVM چگونه است ؟ 
    کدهای XAML صفحه‌ی اصلی : 
    <Window x:Class="TwoViews.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            Title="MVVM Light View Switching"
            d:DesignHeight="300"
            d:DesignWidth="300"
            DataContext="{Binding Main,
                                  Source={StaticResource Locator}}"
            ResizeMode="NoResize"
            SizeToContent="WidthAndHeight"
            mc:Ignorable="d">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
    
            <ContentControl Content="{Binding CurrentViewModel}" />
    
            <DockPanel Grid.Row="1" Margin="5">
                <Button Width="75"
                        Height="23"
                        Command="{Binding SecondViewCommand}"
                        Content="Second View"
                        DockPanel.Dock="Right" />
                <Button Width="75"
                        Height="23"
                        Command="{Binding FirstViewCommand}"
                        Content="First View"
                        DockPanel.Dock="Left" />
            </DockPanel>
        </Grid>
    </Window>

    2 دکمه در صفحه‌ی اصلی وجود دارد ، یکی از آنها وظیفه‌ی بارگذاری View اول و دیگری وظیفه‌ی بارگذاری View دوم را دارد ،  این دکمه‌ها نقش منو را در یک نرم افزار واقعی به عهده دارند. 
    کدهای View-Model گره خورده (به کمک الگوی ViewModolLocator ) به View اصلی  : 
        /// This is our MainViewModel that is tied to the MainWindow via the 
        /// ViewModelLocator class.
        /// </summary>
        public class MainViewModel : ViewModelBase
        {
            /// <summary>
            /// Static instance of one of the ViewModels.
            /// </summary>
            private static readonly SecondViewModel SecondViewModel = new SecondViewModel();
            /// <summary>
            /// Static instance of one of the ViewModels.
            /// </summary>
            private static readonly FirstViewModel FirstViewModel = new FirstViewModel();
            /// <summary>
            /// The current view.
            /// </summary>
            private ViewModelBase _currentViewModel;
            /// <summary>
            /// Default constructor.  We set the initial view-model to 'FirstViewModel'.
            /// We also associate the commands with their execution actions.
            /// </summary>
            public MainViewModel()
            {
                CurrentViewModel = FirstViewModel;
                FirstViewCommand = new RelayCommand(ExecuteFirstViewCommand);
                SecondViewCommand = new RelayCommand(ExecuteSecondViewCommand);
            }
            /// <summary>
            /// The CurrentView property.  The setter is private since only this 
            /// class can change the view via a command.  If the View is changed,
            /// we need to raise a property changed event (via INPC).
            /// </summary>
            public ViewModelBase CurrentViewModel
            {
                get { return _currentViewModel; }
                set
                {
                    if (_currentViewModel == value)
                        return;
                    _currentViewModel = value;
                    RaisePropertyChanged("CurrentViewModel");
                }
            }
            /// <summary>
            /// Simple property to hold the 'FirstViewCommand' - when executed
            /// it will change the current view to the 'FirstView'
            /// </summary>
            public ICommand FirstViewCommand { get; private set; }
            /// <summary>
            /// Simple property to hold the 'SecondViewCommand' - when executed
            /// it will change the current view to the 'SecondView'
            /// </summary>
            public ICommand SecondViewCommand { get; private set; }
            /// <summary>
            /// Set the CurrentViewModel to 'FirstViewModel'
            /// </summary>
            private void ExecuteFirstViewCommand()
            {
                CurrentViewModel = FirstViewModel;
            }
            /// <summary>
            /// Set the CurrentViewModel to 'SecondViewModel'
            /// </summary>
            private void ExecuteSecondViewCommand()
            {
                CurrentViewModel = SecondViewModel;
            }
        }

    این ViewModel از کلاس پایه‌ی چارچوب MVVM Light مشتق شده است.  Command‌ها جهت Handle کردن کلیک دکمه‌ها هستند . نکته‌ی اصلی این ViewModel پراپرتی CurrentViewModel می‌باشد.  این پراپرتی به ویژگی Content کنترل ContentControl مقید (Bind) شده است. با کلیک شدن روی دکمه‌ها View مورد نظر به کاربر نمایش داده می‌شود.
    WPF از کجا می‌داند کدام View را به ازای ViewModel خاص render کند ؟ 
    در فایل App.xaml یک سری DataTemplate تعریف شده است : 
        <Application.Resources>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
            <!--
                We define the data templates here so we can apply them across the
                entire application.
             
                The data template just says that if our data type is of a particular
                view-model type, then render the appropriate view.  The framework
                takes care of this dynamically.  Note that the DataContext for
                the underlying view is already set at this point, so the
                view (UserControl), doesn't need to have it's DataContext set
                directly.
            -->
            <DataTemplate DataType="{x:Type vm:SecondViewModel}">
                <views:SecondView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:FirstViewModel}">
                <views:FirstView />
            </DataTemplate>
        </Application.Resources>

    به کمک این DataTemplate‌ها مشخص شده اگر نوع داده‌ی ما از یک نوع View-Model خاص می‌باشد View مناسب را به ازای آن Render کند. با تعریف DataTemplate‌ها در App.Xaml می‌توان از آنها در سطح نرم افزار استفاده کرد. می‌توان DataTemplate‌ها را جهت خلوت کردن App.xaml به Resource دیگری انتقال داد.
    دریافت مثال : TwoViews.zip 

     
    مطالب
    توسعه برنامه های Cross Platform با Xamarin Forms & Bit Framework - قسمت پنجم
    همانطور که در قسمت‌های قبلی گفتیم، کد UI و Logic پروژه مابین Android-iOS-Windows مشترک بوده و از یک کد، سه بار استفاده مجدد می‌شود. تا این جا نیز می‌دانید که چطور کد را روی ویندوز و Android تست کرده و پابلیش بگیرید. این قسمت، نوبت به iOS می‌رسد.
    برای دیباگ و تست پروژه‌ها بر روی iOS چه بر روی Simulator و چه بر روی Device، نیاز به وجود یک Mac در شبکه است. حال این می‌تواند یک Mac Book Pro فیزیکی باشد یا یک Virtual Mac روی VM Ware. ابتدا به آموزش راه اندازی Mac بر روی VM Ware می‌پردازیم، سپس ادامه راه برای Mac، روی یک سخت افزار واقعی و Virtual Mac یکی است.

    برای شروع لازم است فایل iso مک را دانلود کنید. من "Mac OS 10.14 iso download" را جستجو کردم به این سایت رسیدم که فایل مناسب برای دانلود را در این لینک قرار داده بود.
    سپس اقدام به دانلود VM Ware کنید و چون VM Ware به صورت پیش فرض از Mac پشتیبانی نمی‌کند، VM Ware Unlocker را نیز جستجو کرده، دانلود و نصب کنید. مطمئن شوید که نسخه‌های مورد استفاده شما قدیمی نباشند. نسخه مورد استفاده بر روی سیستم من 14.1 است.
    برای این که VM Ware کار کند، باید اقدام به " فعال سازی intel virtualization" هم کرده باشید که  این سایت  یکی از آموزش‌های موجود بر روی بستر اینترنت، برای این کار است. همچنین برای نصب Mac احتیاج به Apple ID دارید که رایگان است.
    علاوه بر نصب Mac، لازم است روی آن XCode نیز نصب شود. رابطه مستقیمی بین نسخه ویژوال استدیو، نسخه Mac و نسخه XCode برقرار است. مثلا برای استفاده از iOS SDK 12 که آخرین نسخه است، لازم است XCode 10 داشته باشید. خود XCode 10 بر روی Mac با نسخه 10.13.6 و بالاتر نصب می‌شود و در نهایت نیاز به Visual Studio 15.8.5 به بالا است. صرف به روز رسانی ویژوال استودیو از مثلا 15.7 به 15.8.5 دردی را دوا نمی‌کند و نیاز به بروز رسانی Mac و XCode نیز هست. (تمامی این موارد را خود ویژوال استودیو چک می‌کند و در صورت لزوم خطا می‌دهد)
    پس از دانلود فایل iso برای Mac و نصب و Unlock کردن VM Ware، آماده راه اندازی Mac هستید. در VM Ware از منوی File روی New virtual machine کلیک کرده و در مراحل بعدی آن iso دانلود شده را معرفی و Virtual machine را ذخیره کنید.
    بهتر است برای Mac خود حدود 40GB فضای هارد SSD در نظر بگیرید. در دادن CPU و رم، دست و دل باز باشید. توجه داشته باشید که لازم است Mac به اینترنت دسترسی داشته باشد. برای بهبود سرعت Virtual Machine تان، فولدر محل ذخیره سازی فایل‌های آن و Process ای با نام vmware-vmx.exe را  در آنتی ویروس ویندوزتان Exclude کنید.
    قبل از این که Mac را روشن کنید، یک فایل با پسوند vmx را در فولدر Virtual Machine تان پیدا کنید و خط زیر را به آخر آن اضافه کرده و Save کنید:
    smc.version = "0"
    سپس روی Mac راست کلیک نموده و از Settings > Hardware > USB Controller مقدار USB Compatibility را روی 2.0 بگذارید و تیک Show all usb input devices را نیز بزنید.
    Mac را روشن کنید تا مراحل نصب آغاز شود. ابتدا از macOS Utilities، گزینه Disk Utility هارد 40 گیگا بایتی مجازی را که ساخته بودید، انتخاب و Erase کنید و سپس برنامه را بسته و Install MacOS را انتخاب کنید. در واقع هاردی را که ساخته بودید، مثل یک هارد فیزیکی بوده که پارتشن بندی نشده و غیر قابل استفاده بوده‌است. با کمک Disk Utility این هارد آماده به استفاده می‌شود.
    حال به قسمت تنظیمات Mac رفته و در قسمت Energy Saver، تیک گزینه Put hard disk to sleep را بردارید. همچنین Computer Sleep و Display Sleep را روی Never بگذارید. این یک Virtual Machine است و به این تمهیدات احتیاجی ندارد. سپس از قسمت Desktop & screen saver، تنظیم کنید که هیچ وقت Screen saver را نمایش ندهد. از قسمت Security & Privacy، تیک Require password را نیز بردارید.
    در Mac ترمینال (Terminal) را باز کنید و عبارت زیر را در آن اجرا کنید تا فایل‌های مخفی را نیز بتوانید مشاهده کنید. در ادامه به آن احتیاج داریم.
    defaults write com.apple.finder AppleShowAllFiles YES
    همچنین برای بهبود عملکرد Simulator در virtual machine که فاقد کارت گرافیک است، دستور زیر را در ترمینال وارد کنید:
    defaults write com.apple.CoreSimulator.IndigoFramebufferServices FramebufferEmulationHint 1
    در تنظیمات Mac، قسمت Sharing، تیک Remote Login را بزنید تا فعال شود. File Sharing را نیز بر اساس  این آموزش  برقرار کنید. سپس Mac را Re Start کنید.

    برای نصب XCode دو گزینه دارید:
    ۱- نصب از Apple Store که نیاز به Apple ID و ابزارهای دور زدن تحریم بر روی خود Mac را دارد.
    ۲- دانلود مستقیم فایل xip (فایل فشرده در Mac) از  اینجا که نیاز به Apple ID دارد، ولی نیازی به ابزارهای دور زدن تحریم را ندارد. در مقاله‌ای جداگانه به نحوه دانلود ویژوال استودیو 2017، برای نصب روی چندین سیستم خواهم پرداخت. در کنار آن اگر فایل iso مربوط به mac و xip مربوط به xcode را نیز داشته باشید، روی سیستم دوم به بعد، نیاز به دانلود چندانی ندارید.
    اگر فایل xip مربوط به XCode را مستقیما درون Mac دانلود کنید یا از Apple Store بگیرید که هیچ، ولی اگر آن را در ویندوز دانلود کرده‌اید و یا از کسی گرفته‌اید، از طریق File Sharing، آن را به Mac انتقال دهید. برای به دست آوردن IP، از طریق System Preferences به Network بروید.
    برای نصب فایل xip در mac، ابتدا روی آن دو بار کلیک کنید تا extract شود. سپس در Mac از منوی Go، به Applications رفته (یا Shift و آرم ویندوز و A را با هم بفشارید) و XCode را روی آن Drag & Drop کنید؛ به طوری که یکی از برنامه‌های قسمت Applications شود.  سپس آن را باز کرده و از منوی XCode، به Preferences رفته و در تب Locations، جلوی Command Line Tools، گزینه Xcode 10 را انتخاب کنید. حالا یک Mac را درون شبکه دارید که Remote Login دارد و Command Line Tools مربوط به XCode آن نیز تنظیم شده‌است.  به هیچ روی، نیازی به کد زدن در Mac یا XCode نیست.

    برای اتصال ویژوال استودیو به Mac، ابتدا پروژه مثال XamApp را باز کرده و بعد به منوی Tools رفته و Options را باز کنید و به Xamarin بروید. در قسمت iOS Settings روی Pair Mac کلیک کنید و IP مربوط به Mac خود را وارد کنید. بعد از زدن نام کاربری و رمز عبور، ویژوال استودیو درخواست نصب Mono را می‌کند که روی Install کلیک کنید. پس از اتمام نصب Mono، ممکن است ویژوال استودیو گمان کند که موفق نبوده‌است! برای اطمینان، در Mac ترمینال را باز کرده و دستور mono --version را وارد نمایید. در صورتی که عبارتی شبیه به Mono JIT compiler version 5.12 را ببینید، عملا پروسه با موفقیت انجام شده است، وگرنه Mono را بر اساس  این آموزش  در Mac نصب کنید. سپس ویژوال استودیو، Xamarin.iOS را در Mac نصب می‌کند.
    همچنین در صورت داشتن Apple Developer Account می‌توانید در ویژوال استودیو با آن لاگین کنید. ابتدا به منوی Tools رفته و Options را باز کنید و از قسمت Xamarin به  Apple Accounts بروید. روی Install fastlane کلیک کنید و بعد User/Pass خود را وارد کنید. بدون Apple Developer Account، تست برنامه روی گوشی کمی سخت می‌شود و پابلیش و گرفتن فایل ipa بدون آن غیر ممکن است. اینها تماما سیاست‌های Apple بوده و به Xamarin ارتباطی ندارند. در مقاله آموزش App Center، به نحوه پابلیش فایل‌های Android apk و iOS ipa برای تستر‌ها و عموم مردم خواهیم پرداخت.
    حال می‌توانید پروژه‌های XamApp.Android و XamApp.UWP را Unload نموده و پروژه XamApp.iOS را Load کنید و پروژه XamApp.iOS را Set as start up project نموده و پس از اطمینان از انتخاب بودن iPhone Simulator و iPhone 6، برنامه را اجرا کنید.

    امکان تست بر روی بر روی آخرین نسخه iOS یعنی 12 بر روی iPhone 5s تا iPhone XS Max وجود دارد. علاوه بر این می‌توانید iOS 12 را روی iPad نسل پنج و شش و iPad Air 1 و 2 و iPad Pro تست کنید. اگر قصد تست روی نسخه‌های قدیمی‌تر iOS، چون iOS 11 یا سایر دستگاه‌ها را دارید، باید ابتدا در XCode، از منوی Window به Devices and simulators بروید و در تب Simulators روی + کلیک کنید. در قسمت OS version می‌توانید نسخه‌های قدیمی‌تر را دانلود کنید یا برای Apple TV و Apple Watch نیز Simulator بسازید.

    برنامه را روی iPhone 6 یا یک گوشی سبک و ساده دیگر گذاشته و برنامه را اجرا کنید و تست بگیرید. دقت کنید که Simulator روی ویندوز اجرا می‌شود و نیازی به سوئیچ مداوم بین ویندوز و Mac نیست. ولی اگر Simulator روی ویندوز از لحاظ UI ای عملکرد مناسبی را نداشت، در ویژوال استودیو به منوی Tools رفته و از Options > Xamarin > iOS settings تیک Remote simulator to Windows را بردارید که باعث می‌شود Simulator در Mac اجرا شود. در هر بار عوض کردن Simulator از گوشی ای به گوشی دیگر، پروژه را Clean - Rebuild کنید.

    در سری‌های بعد که ویژوال استودیو را باز می‌کنید، از منوی Tools > iOS گزینه Pair Mac را بزنید و به Mac خود متصل شوید.


    برای اینکه بتوانید روی گوشی تست بگیرید، در همین عکس بالا، به جای iPhoneSimulator، گزینه iPhone را انتخاب کنید. بهتر است گوشی به آخرین نسخه iOS آپدیت شده باشد. همچنین iTunes for windows را نصب کنید تا ابتدا ویندوز، گوشی شما را که با کابل به کامپیوتر وصل کرده‌اید بشناسد. سپس در VM Ware درخواست کنید که گوشی به جای ویندوز، به Virtual Machine مک شما وصل شود. در قسمت پایین - سمت راست VM Ware برای هر سخت افزار متصل به کامپیوتر، یک گزینه هست که آنهایی که پر رنگ هستند، سخت افزارهای متصل به Virtual Mac بوده و کمرنگ‌ها را Mac نمی‌بیند. روی سخت افزار گوشی خود کلیک کنید و Connect را بزنید. حال باید بتوانید در iTunes موجود در Mac، اطلاعات مربوط به گوشی خود را مشاهده کنید. 

    به ویژوال استودیو برگشته و در قسمت Properties پروژه XamApp.iOS، به تب iOS Bundle signing رفته و ضمن انتخاب Automatic provisioning، در قسمت Team، تیم خود را انتخاب کنید. این Team را در زمان ساخت Apple Developer account ایجاد کرده‌اید و همانطور که قبلا در این آموزش گفته شد، اگر در ویژوال استودیو با آن لاگین کرده باشید، می‌توانید آن را ببینید. در صورتی که Apple Developer account ندارید، بر اساس این آموزش پیش بروید.

    زمانیکه برنامه را روی گوشی اجرا می‌کنید، ممکن است در Mac دیالوگ گرفتن نام کاربری و رمز عبور کاربر Mac باز شود، پس نیم نگاهی به آن داشته باشید. پس از اولین اجرای موفق روی گوشی می‌توانید در XCode به منوی Window رفته و سپس Devices & simulators را باز کنید و گوشی خود را در قسمت Devices انتخاب کرده و تیک Connect via network را بزنید تا از این به بعد، بدون کابل نیز بتوانید روی گوشی خود تست کنید. البته گوشی، ویندوز و مک، باید در یک شبکه باشند.

    نحوه پابلیش پروژه را در مقاله مربوط به App Center خواهیم نوشت. اما به صورت خلاصه حجم فایل ipa حدود 10 مگ است که شامل تمامی مواردی است که در قسمت Android توضیح دادیم و پروژه نهایی شما حجمی در همین حدود خواهد داشت و با اضافه کردن چندین فرم حجم اضافه نمی‌شود. همانطور که در قسمت توضیحات پیشرفته پروژه اندروید توضیح دادیم، اینجا نیز از AOT و LLVM برای دست‌یابی به بالاترین سرعت ممکن کدهای Native استفاده شده و کدهای اضافه از پروژه Link (حذف) می‌شوند. برای اینکار، در ویژوال استودیو iPhone - Release را انتخاب کنید و پروژه را بیلد کنید. فایل ipa درون Mac در فولدر 

    Library⁩ ▸ ⁨Caches⁩ ▸ ⁨Xamarin⁩ ▸ ⁨mtbs⁩ ▸ ⁨builds⁩ ▸ ⁨XamApp.iOS⁩ ▸ ⁨e9979ba2348d1c5a87390643d62c4a1b⁩ ▸ ⁨bin⁩ ▸ ⁨iPhone⁩ ▸ Release ▸ XamApp.iOS.ipa 

    ساخته می‌شود که Library فولدری در User شما بوده و مقدار Guid مربوطه، Random است. همچنین XamApp.iOS نام پروژه است.

    حالت‌های متصور برای عکس بالا عبارتند از [Debug - iPhoneSimulator] و [Debug - iPhone] و [Release - iPhone] که دو تای اول برای تست روی Simulator و Device بوده و حالت سوم برای Release کردن فایل ipa. طبیعی است که تنظیم [Release - Simulator] معنی نمی‌دهد.

    با توجه به اینکه محیط توسعه برنامه را آماده کرده‌ایم، از قسمت بعد، به آموزش کدنویسی خواهیم پرداخت.