نظرات مطالب
استفاده از MediaWiki بهترین روش نگهداری یادداشت‌های شخصی خصوصا برای برنامه‌نویس‌ها
- البته شاید این کار به منظور استفاده تک کاربره مناسب باشه اما بسیاری از مزایای اون از دست میره چراکه صدها extension برای مدیاویکی تولید شده و پشتیبانی میشه که دیگه نمیشه ازشون استفاده کرد. مثل افزونه کتاب ساز اون
- مدیاویکی دائم در حال به روز رسانی نرم افزار خودش هست که توسعه اون خیلی سریع رخ میده.
 - نرم افزار اکثرقابلیت‌های مورد نیاز فارسی زبان‌ها رو داره مثلا زبان فارسی و تاریخ شمسی.
- فروم‌های متعدد برای پاسخگویی به اشکالات کاربران وجود داره.
- قابلیت همکاری تیمی که بهترین قابلیت‌های ویکی هست از بین میره.
- فکر میکنم بهترین کار همکاری با تیم تولید کننده در رفع نیازهای بومی باشه مثلا :
  1. ادیتور اون خیلی مناسب کاربر معمولی نیست
  2. در خیلی از موارد چپ چین راست چین کردن متن با مشکل مواجه میشه
  3. دکمه‌های میان بر برای خیلی از عملیات رو نداره
  4. موقع تایپ مطلب قابلیت WYSIWYG وجود نداره باید به preview رفت یا مطلب رو ذخیره کرد و سپس نتیجه اونو دید
اشتراک‌ها
سایت فارسی dotnetnke
پلت‌فرم دی‌ان‌ان که قبلا با نام دات‌نت‌نیوک شناخته می‌شد، یک سیستم مدیریت محتوای کدباز، قابل توسعه، امن و مقیاس پذیر است که صدها هزار کسب و کار کوچک و بزرگ از آن برای راه اندازی وب سایت خود استفاده کرده‌اند. پلت‌فرم دی‌ان‌ان در حقیقت نسخه رایگان دی‌ان‌ان و همچنین بستر و مبنای نسخه‌های تجاری دی‌ان‌ان نظیر ایوک کانتنت و ایوک اِنگیج می‌باشد. نسخه‌های تجاری دی‌ان‌ان شامل پلت‌فرم دی‌ان‌ان و چندین افزونه جدید و مکمل می‌باشند. دی‌ان‌ان با داشتن بیش از یک میلیون عضو، بیش از یک میلیون دانلود و بیش از هشت صد هزار سایت مبتنی بر آن در طول ده سال گذشته، ثابت کرده است که بستری قابل اعتماد بوده و شما می‌توانید با اطمینان کسب و کار خود را با تکیه بر آن بسازید .
سایت فارسی dotnetnke
مسیرراه‌ها
ASP.NET MVC
              مطالب
              ایجاد پروژه از نوع SPB در VS2010
              SharePoint Branding یکی از قالب‌های رایگان است که در قسمت Online Template نسخه 2010 ویژوال استودیو قابل استفاده است .همچنین شما می‌توانید قالب آن را از اینجا دانلود کنید . 

              این تصویر یک نمونه خروجی (به صورت پیش فرض) از این نوع پروژه است :

               

              برای ایجاد یک پروژ از نوع SPB به ترتیب زیر عمل کنید :

               
              1- قالب را از اینجا دانلود کنید یا مانند شکل زیر به قسمت Online Template در Visual Studio 2010 مراجعه کنید و از بین گزینه‌های موجود ، SharePoint Branding را انتخاب نمایید و آن را نصب نمایید 

              2 - پس از نصب ، پروژه ای از این نوع باز کنید تا پروژه به نمایش در آید(زیر مجموعه شیرپوینت 2010) :

               

              اکنون می‌توانید با تغییرات در Master Page‌ها و یا در CSS‌ها و تغییر logo و faveicon سفارشی سازی را آغار کنید و در نهایت با deploy کردن ، تغییرات اعمال می‌شوند 

              بیشتر 

              مطالب
              توسعه برنامه‌های Cross Platform با Xamarin Forms & Bit Framework - قسمت چهاردهم
              در این قسمت قصد داریم به بررسی نحوه‌ی مدیریت خطاها و لاگ کردن آنها بپردازیم. همچنین در ادامه Analytics را در برنامه فعال می‌کنیم تا اطلاعاتی از دستگاه‌های کاربران و ... را به دست بیاوریم (اگر آخرین تغییرات XamApp را Pull/Clone کنید، حاوی تمامی تغییرات زیر است).

              در برنامه‌های Native موبایل که شامل Xamarin Forms نیز می‌شود، هر خطایی می‌تواند باعث Crash کردن کل برنامه شود. در Bit Framework، تمامی خطاها مدیریت می‌شوند، تا جلوی بسته شدن برنامه گرفته شود و از این بابت مشکلی متوجه برنامه نمی‌شود و در کدها نیازی به نوشتن Try/Catch هم نیست. خطاها پس از رخ دادن، به کلاس BitExceptionHandler ارسال می‌شوند. شما می‌توانید از این کلاس ارث بری کنید و به شکل زیر حداقل از رخ دادن خطاها در Debug Mode مطلع شوید:
              public class XamAppExceptionHandler : BitExceptionHandler
              {
                   public override void OnExceptionReceived(Exception exp, IDictionary<string, string> properties = null)
                    {
              #if DEBUG
                          System.Diagnostics.Debugger.Break();
              #endif
                          base.OnExceptionReceived(exp, properties);
                    }
              }
              سپس در ابتدای برنامه‌های Android/iOS/Windows یعنی در فایل‌های MainActivity.cs/AppDelegate.cs/App.xaml.cs کد زیر را برای معرفی کلاس خودتان استفاده کنید:
              BitExceptionHandler.Current = new XamAppExceptionHandler();
              به صورت پیش فرض، تمامی خطاها را در قسمت System.Diagnostics.Debugger.Break مشاهده خواهید نمود، ولی می‌توانید با باز کردن Exception Settings از منوی Debug > Windows > Exception Settings در ویژوال استودیو و تیک زدن Common Language Runtime Exceptions، تمامی خطاها را در جائیکه رخ می‌دهند، مشاهده کنید که به شما اطلاعات بیشتری نیز می‌دهد.


              حال برای لاگ کردن این خطاها، می‌توانید از Microsoft's AppCenter استفاده کنید. استفاده از امکانات App Center رایگان بوده و برای استفاده‌ی در ایران محدودیتی ندارد. ابتدا در سایت مربوطه ثبت نام کنید و سپس سه بار Add New app را بزنید و به نام‌های XamApp_Windows، XamApp_iOS و XamApp_Android سه برنامه را بسازید و برای Android و iOS گزینه‌ی Xamarin را انتخاب و برای ویندوز نیز UWP را انتخاب کنید.

              سپس پکیج‌های Microsoft.AppCenter.Crashes و Microsoft.AppCenter.Analytics را بر روی XamApp نصب نموده و کد زیر را در سه فایل AppDelegate.cs/MainActivity.cs/App.xaml.cs برای iOS/Android/Windows کپی کنید:

              AppCenter.Start("copy-your-guid-key-for-iOS-Android-Windows-here", typeof(Crashes), typeof(Analytics));

              برای هر یک از برنامه‌های Android/iOS/Windows یک Guid متفاوت دارید که در قسمت Getting Started در سایت App Center می‌توانید آنها را مشاهده کنید. هر بار که این کد را کپی می‌کنید، مقدار Guid درست را بگذارید.

              برای گزارش کردن خطاهای برنامه، کافی است کد زیر را به XamAppExceptionHandler.cs که در ابتدای این قسمت در موردش صحبت کرده بودیم اضافه کنید:

              Crashes.TrackError(exp, properties);

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


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

              // code 1...
              try
              {
                    // code 2...
              }
              catch (Exception ex)
              {
                              BitExceptionHandler.Current.OnExceptionReceived(ex, new Dictionary<string, string>
                              {
                                  { "SomeData", "2" }
                              });
              }
              // code 3...

              در این کد مثال، فرض کنیم که برخی اوقات در code 2 خطایی رخ می‌دهد که برای ما مهم نیست و می‌خواهیم حتی در صورت رخ دادن خطا، code 3 اجرا شود. توصیه می‌کنیم در این موارد که در برنامه خیلی هم نباید متداول باشد، لااقل خطا را با کمک کد BitExceptionHandler.Current.OnExceptionReceived لاگ کنید و همچنین با داشتن یک Dictionary می‌توانید حتی دیتای بیشتری را نیز به AppCenter فرستاده و در پرتال مربوطه مشاهده کنید.

              به صورت کلی بهتر است از این نوع Try/Catch‌ها پرهیز کنید و حتی اگر جایی Catch ای نوشتید، در نهایت دوباره خطا را throw کنید.

              try
              {
                   // some codes...
              }
              catch
              {
                    // Do something related to exception...
                    // for example, show some alerts to the user.
                    throw; // You don't need to call BitExceptionHandler.Current.OnExceptionReceived...
              }

              در مثال فوق، قصد داریم وقتی خطایی رخ داد، پیامی را به کاربر اطلاع دهیم. در این صورت، پس از نمایش پیام مربوطه، مجددا خطا را throw کنید. در این صورت، نیازی به فراخوانی BitExceptionHandler.Current.OnExceptionReceieved نیز نیست.


              البته AppCenter در زمینه پابلیش کردن برنامه و همچنین Push Notification و ... نیز دارای امکاناتی هست که به موضوع این قسمت ارتباطی ندارند.

              مطالب
              ایجاد سرویس چندلایه‎ی WCF با Entity Framework در قالب پروژه - 3
              پیش از ادامه‌ی نوشتار بهتر است توضیحاتی درباره‎ی قالب‎های T4 داده شود. این قالب‏‌های مصنوعی حاوی کدهایی که است که هدف آن صرفه‎جویی در نوشتن کد توسط برنامه‏ نویس است. مثلاً در MVC شما یکبار قالبی برای صفحه Index خود تهیه می‏‌کنید که برای نمونه بجای ساخت جدول ساده، از گرید Kendo استفاده کند و همچنین دارای دکمه ویرایش و جزئیات باشد. از این پس هر بار که نیاز به ساخت یک نمای نوع لیست برای یک ActionResult داشته باشید فرم‏ ساز MVC از قالب شما استفاده خواهد کرد. روشن است که خود Visual Studio نیز از T4 در ساخت بسیاری از فرم‏ها و کلاس‏‌ها بهره می‏برد.
              خبر خوب این‏که برای ساخت کلاس‏‌های هر موجودیت در Entity Framework نیز از قالب‏های T4 استفاده می‏شود و این‏که این قالب‏‌ها در دسترس توسعه‌دهندگان برای ویرایش یا افزودن است.
              افزونه‌ی  Tangible را دریافت کنید و سپس نصب کنید. این افزونه ظاهر نامفهوم قالب‏های T4 را ساده و روشن می‏کند. 
              ما نیاز داریم که خود Visual Studio زحمت این سه کار را بکشد: 
              1- بالای هر کلاس موجودیت عبارت using System.Runtime.Serialization; را بنویسید.
              2- صفت [DataContract] را پیش از تعریف کلاس بیفزاید.
              3- صفت [DataMember] را پیش از تعریف هر ویژگی بیفزاید.
              همانند شکل زیر روی فایل MyNewsModel.tt دوکلیک کنید تا محتوای آن در سمت چپ نشان داده شود. این محتوا باید ظاهری همانند شکل پیدا کرده باشد:

              کد زیر را در محتوای فایل جست‌وجو کنید:
                  public string Property(EdmProperty edmProperty)
                  {
                      return string.Format(
                          CultureInfo.InvariantCulture,
                          "{0} {1} {2} {{ {3}get; {4}set; }}",
                          Accessibility.ForProperty(edmProperty),
                          _typeMapper.GetTypeName(edmProperty.TypeUsage),
                          _code.Escape(edmProperty),
                          _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                          _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
                  }
              متن آن‌را به این صورت تغییر دهید:
                  public string Property(EdmProperty edmProperty)
                  {
                      return string.Format(
                          CultureInfo.InvariantCulture,
              "[DataMember]" + Environment.NewLine +
                          "{0} {1} {2} {{ {3}get; {4}set; }}",
                          Accessibility.ForProperty(edmProperty),
                          _typeMapper.GetTypeName(edmProperty.TypeUsage),
                          _code.Escape(edmProperty),
                          _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                          _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
                  }
              بار دیگر به دنبال این کد بگردید:
               public string EntityClassOpening(EntityType entity)
                  {
                      return string.Format(
                          CultureInfo.InvariantCulture,
                          "{0} {1}partial class {2}{3}",
                          Accessibility.ForType(entity),
                          _code.SpaceAfter(_code.AbstractOption(entity)),
                          _code.Escape(entity),
                          _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
                  }
              این کد را نیز به این صورت تغییر دهید:
                  public string EntityClassOpening(EntityType entity)
                  {
                      return string.Format(
                          CultureInfo.InvariantCulture,
              "[DataContract]" + Environment.NewLine + 
                          "{0} {1}partial class {2}{3}",
                          Accessibility.ForType(entity),
                          _code.SpaceAfter(_code.AbstractOption(entity)),
                          _code.Escape(entity),
                          _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
                  }
              برای واپسین تغییر به دنبال کد زیر بگردید:
                  public string UsingDirectives(bool inHeader, bool includeCollections = true)
                  {
                      return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
                          ? string.Format(
                              CultureInfo.InvariantCulture,
                              "{0}using System;{1}" +
                              "{2}",
                              inHeader ? Environment.NewLine : "",
                              includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
                              inHeader ? "" : Environment.NewLine)
                          : "";
                  }
              سپس کد زیر را جاگزین آن کنید:
                  public string UsingDirectives(bool inHeader, bool includeCollections = true)
                  {
                      return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
                          ? string.Format(
                              CultureInfo.InvariantCulture,
              "using System.Runtime.Serialization;" + Environment.NewLine +
                              "{0}using System;{1}" +
                              "{2}",
                              inHeader ? Environment.NewLine : "",
                              includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
                              inHeader ? "" : Environment.NewLine)
                          : "";
                  }
              فایل MyNewsModel.tt را ذخیره کنید و از آن خارج شوید. بار دیگر هر کدام از کلاس‌های tblNews و tblCategory را باز کنید. خواهید دید که به صورت خودکار تغییرات مد نظر ما به آن افزوده شده است. از این پس بدون هیچ دلواپسی بابت حذف صفت‎ها، می‎توانید هرچند بار که خواستید مدل خود را به‎هنگام کنید.
              در بخش پسین دوباره به WCF بازخواهیم گشت و به تعریف روال‏های مورد نیاز خواهیم پرداخت.