Git
NoSQL
- NoSQL ؟
- مروری بر مفاهیم مقدماتی NoSQL
- ردهها و انواع مختلف بانکهای اطلاعاتی NoSQL
- NoSQL و مایکروسافت
- چه زمانی بهتر است از بانکهای اطلاعاتی NoSQL استفاده کرد و چه زمانی خیر؟
- NOSQL قسمت اول
- NOSQL قسمت دوم
- NOSQL قسمت سوم
- آموزش PouchDB : قسمت اول (معرفی)
- آموزش PouchDB : قسمت دوم (شروع به کار)
- آموزش BrightStarDb (قسمت اول)
- پیاده سازی UnitOfWork برای BrightStarDb
- MongoDB #1
- MongoDB #2
- MongoDB #3
- MongoDB #4
- MongoDB #5
- MongoDB #6
- MongoDB #7
- MongoDB #8
- MongoDB #9
- MongoDB #10
- MongoDB #11
- MongoDB #12
- MongoDB #13
- MongoDB #14
- MongoDB #15
بخش دوم: عملیات به روزرسانی، حذف و ایندکس گذاری
بخش سوم: ذخیره و بازیابی فایل
بخش چهارم :Chunk
بخش پنجم : پشتیبانی گیری و بازگردانی
بخش ششم: Import & Export
بخش هفتم : دیتاهای ایستا و پویا
بخش هشتم : الگوی Repository
شاید عنوان کنید که کافی است متن ورودی را بر اساس فاصلهی بین کلمات تقسیم بندی کرده و سپس تعداد کلمات بدست آمده را محاسبه کنیم:
var words = text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); return words.Length;
[TestMethod] public void TestInvalidChars() { const string data = "To be . ! < > ( ) ! ! , ; : ' ? + -"; Assert.AreEqual(2, data.WordsCount()); }
var words = text.Split( new[] { ' ', ',', ';', '.', '!', '"', '(', ')', '?', ':', '\'', '«' , '»', '+', '-' }, StringSplitOptions.RemoveEmptyEntries); return words.Length;
[TestMethod] public void TestSimpleHtmlSpacesWithNewLine() { const string data = "<b>this is a test.</b>\n\r<b>this is a test.</b>"; Assert.AreEqual(8, data.WordsCount()); }
اگر این موارد را در نظر بگیریم، به کلاس ذیل خواهیم رسید:
using System; using System.Text.RegularExpressions; namespace ReadingTime { public static class CalculateWordsCount { private static readonly Regex _matchAllTags = new Regex(@"<(.|\n)*?>", RegexOptions.IgnoreCase | RegexOptions.Compiled); public static int WordsCount(this string text) { if (string.IsNullOrWhiteSpace(text)) { return 0; } text = text.cleanTags().Trim(); text = text.Replace("\t", " "); text = text.Replace("\n", " "); text = text.Replace("\r", " "); var words = text.Split( new[] { ' ', ',', ';', '.', '!', '"', '(', ')', '?', ':', '\'', '«' , '»', '+', '-' }, StringSplitOptions.RemoveEmptyEntries); return words.Length; } private static string cleanTags(this string data) { return data.Replace("\n", "\n ").removeHtmlTags(); } private static string removeHtmlTags(this string text) { return string.IsNullOrEmpty(text) ? string.Empty : _matchAllTags.Replace(text, " ").Replace(" ", " "); } } }
پس از اینکه موفق به شمارش تعداد کلمات یک متن HTML ایی شدیم، اکنون میتوان این تعداد را تقسیم بر 180 (یک عدد معمول و متداول) کرد تا زمان خواندن کل متن بدست آید. سپس با استفاده از متد toReadableString میتوان آنرا به شکل قابل خواندنتری نمایش داد.
using System; namespace ReadingTime { public static class CalculateReadingTime { public static string MinReadTime(this string text, int wordsPerMinute = 180) { var wordsCount = text.WordsCount(); var minutes = wordsCount / wordsPerMinute; return minutes == 0 ? "کمتر از یک دقیقه" : TimeSpan.FromMinutes(minutes).toReadableString(); } private static string toReadableString(this TimeSpan span) { var formatted = string.Format("{0}{1}{2}{3}", span.Duration().Days > 0 ? string.Format("{0:0} روز و ", span.Days) : string.Empty, span.Duration().Hours > 0 ? string.Format("{0:0} ساعت و ", span.Hours) : string.Empty, span.Duration().Minutes > 0 ? string.Format("{0:0} دقیقه و ", span.Minutes) : string.Empty, span.Duration().Seconds > 0 ? string.Format("{0:0} ثانیه", span.Seconds) : string.Empty); if (formatted.EndsWith("و ")) { formatted = formatted.Substring(0, formatted.Length - 2); } if (string.IsNullOrEmpty(formatted)) { formatted = "0 ثانیه"; } return formatted.Trim(); } } }
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید:
ReadingTime.zip
اما ... چقدر خوب میشد که امکان ترکیب هردوی اینها با هم در یک برنامه وجود میداشت؛ یعنی داشتن یک آغاز سریع، به همراه تعاملات سریع با DOM. به همین جهت Auto Render Mode به Blazor 8x اضافه شدهاست.
نحوهی عملکرد حالت رندر تعاملی خودکار در Blazor 8x
زمانیکه از قرار است از Auto Render Mode استفاده شود، یعنی در نهایت به سراغ حالت رندر وباسمبلی رفتن؛ اما به شرطیکه که فریمورک، مطمئن شود میتواند تمام فایلهای مرتبط را خیلی سریع و در کمتر از 100 میلیثانیه تامین کند که عموما یک چنین حالتی به معنای از پیش دریافت کردن این فایلها و کش شده بودن آنها در مرورگر است. اما اگر یک چنین تضمینی وجود نداشته باشد، از همان ابتدای کار تصمیم میگیرد که باید کامپوننت را از طریق نگارش Blazor Server آن ارائه دهد، تا آغاز سریعی را سبب شود. در این بین هم در پشت صحنه (یعنی زمانیکه کاربر مشغول به کار با نگارش Blazor Server کامپوننت است)، شروع به دریافت فایلهای مرتبط با نگارش وباسمبلی کامپوننت و برنامه میشود تا آنها را کش کرده و برای بار بعدی بارگذاری صفحه و نمایش اطلاعات آن، به سرعت از آنها استفاده کند.
یک چنین حالتی برای کاربران به این معنا است که به محض گشودن برنامه و صفحهای، قادر به استفادهی از آن هستند و برای بارهای بعدی استفاده، دیگر نیازی به اتصال دائم SignalR یک جزیرهی تعاملی Blazor Server نداشته و در نتیجه بار کمتری به سرور تحمیل خواهد شد (مقیاس پذیری بیشتر) و همچنین پردازش DOM بسیار سریعتری را نیز شاهد خواهند بود (کار با نگارش Blazor WASM درون مرورگر).
همانطور که در این تصویر هم مشخص است، برای بار اول نمایش یک چنین جزیرههایی، یک اتصال وبسوکت برقرار میشود که به معنای فعال شدن حالت جزیرهای Blazor Server است که در قسمت پنجم بررسی کردیم. در این بین فایلهای Blazor WASM این جزیره هم دریافت و کش میشوند که در کنسول توسعه دهندههای مرورگر، لاگ شدهاست. این اتصال وبسوکت، در بار اول نمایش این کامپوننت، بسته نخواهد شد؛ تا زمانیکه کاربر به صفحهای دیگر مراجعه کند. در دفعهی بعدی که درخواست نمایش این صفحه را داشته باشیم، چون اطلاعات نگارش وباسمبلی آن کش شدهاست، از همان ابتدای کار نگارش وب اسمبلی را بارگذاری و راهاندازی میکند.
تفاوت قالب پروژههای Auto Render Mode با سایر حالتهای رندر در Blazor 8x
برای ایجاد قالب ابتدایی پروژهی یک چنین حالت رندری، از دستور dotnet new blazor --interactivity Auto استفاده میشود که حالت تعاملی آن به Auto تنظیم شدهاست. در نگاه اول، Solution ایجاد شدهی آن، بسیار شبیه به Solution جزیرههای تعاملی Blazor WASM است که در قسمت هفتم به همراه یک مثال کامل بررسی کردیم؛ یعنی از دو پروژهی سمت سرور و سمت کلاینت تشکیل میشود و دارای این تفاوتها است:
در فایل Program.cs پروژهی سمت سرور آن، افزوده شدن هر دو حالت جزایر تعاملی Blazor Server و همچنین Blazor WASM را مشاهده میکنیم:
// ... builder.Services.AddRazorComponents() .AddInteractiveServerComponents() .AddInteractiveWebAssemblyComponents(); // ... app.MapRazorComponents<App>() .AddInteractiveServerRenderMode() .AddInteractiveWebAssemblyRenderMode() .AddAdditionalAssemblies(typeof(Counter).Assembly);
الف) امکان تعریف صفحات فقط SSR در پروژهی سمت سرور
ب) امکان داشتن جزیرههای تعاملی فقط Blazor Server در پروژهی سمت سرور
ج) امکان داشتن جزیرههای تعاملی فقط Blazor Wasm در پروژهی سمت کلاینت
د) به همراه امکان تعریف جزیرهای تعاملی Auto Render Mode در پروژهی سمت کلاینت
یک نکته: در این تنظیمات، متد AddAdditionalAssemblies، امکان استفاده از کامپوننتهای قرار گرفتهی در سایر اسمبلیها و پروژهها را میسر میکند.
نحوهی تعریف کامپوننتهایی که قرار است توسط Auto Render Mode ارائه شوند
باتوجه به اینکه این نوع کامپوننتها در نهایت قرار است به صورت وباسمبلی رندر شوند، آنها را باید در پروژهی سمت کلاینت قرار داد و به نکات مرتبط با توسعهی آنها که در قسمت هفتم پرداختیم، توجه داشت.
همچنین مانند سایر حالتهای رندر، به دو طریق میتوان مشخص کرد که یک کامپوننت باید به چه صورتی رندر شود:
الف) استفاده از دایرکتیو حالت رندر با مقدار InteractiveAuto در ابتدای تعریف یک کامپوننت
@rendermode InteractiveAuto
<Banner @rendermode="@InteractiveAuto" Text="Hello"/>
@using static Microsoft.AspNetCore.Components.Web.RenderMode
روی متدهای GetAllCategory و GetAllNews به صورت جداگانه کلیک کنید. متوجه خواهید شد که هرچند در کلاس tblNews شیای از نوع tblCategory و در کلاس tblCategory شیای از نوع مجموعهی tblNews به صورت Virtual تعریف شده است ولی در بر خلاف انتظارمان اثری از آن در اینجا دیده نمیشود. نتیجهی مشاهدهشده به خاطر است که در هر دو تعریف صفت DataMember را به ویژگیهای ناوبری اختصاص نداده ایم و این میتواند راهبرد ما در طراحی WCF باشد. ولی اگر میخواهید ویژگی ناوبری میان موجودیتها در متدهای ما هم دیده شود ادامهی این درس را بخوانید وگرنه ممکن است تصمیم داشته باشید در صورت نیاز به پیوند میان موجودیتها، متد جدیدی بنویسید و از دستورهای Linq استفاده کنید و یا برای اینکار از Stored Procedured بهره ببرید.
در اینجا من این سناریو را دنبال میکنم که در صورتی که متد GetAllNews اجرا شود؛ بدون اینکه نیاز باشد برای دانستن نام دستهی خبر از متد دیگری مانند GetAllCategory استفاده کنیم؛ رکورد وابسته موجودیت دسته در هر خبر نشان داده شود.
از Solution Explorer فایل MyNewsModel.tt را باز کنید و دنبال کد زیر بگردید:
public string NavigationProperty(NavigationProperty navigationProperty) { var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()); return string.Format( CultureInfo.InvariantCulture, "{0} {1} {2} {{ {3}get; {4}set; }}", AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, _code.Escape(navigationProperty), _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), _code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); }
سپس آنرا به صورت زیر ویرایش کنید:
public string NavigationProperty(NavigationProperty navigationProperty) { var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()); return string.Format( CultureInfo.InvariantCulture, "{0}{1} {2} {3} {{ {4}get; {5}set; }}", navigationProperty.ToEndMember.RelationshipMultiplicity != RelationshipMultiplicity.Many ? "[DataMember]" + Environment.NewLine : "", AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, _code.Escape(navigationProperty), _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), _code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); }
پس از ذخیرهی فایل، خواهید دید که صفت DataMember در کلاس tblNews پیش از ویژگی tblCategory افزوده شده است. بار دیگر پروژه را اجرا کنید. روی متد GetAllNews کلیک کنید و روی دکمه Invoke بفشارید. خواهید دید که هرچند tblCategory در ویژگیهای آن قرار گرفته است ولی مقدار آن Null است. برای حل این مشکل باید از Solution Explorer فایل MyNewsService.cs را باز کنید و به به جای کد مربوط به متدهای GetAllNews و GetNews کدهای زیر را قرار دهید:
public List<tblNews> GetAllNews()
{
return dbMyNews.tblNews.Include(p=>p.tblCategory).Where(c=>c.IsDeleted == false).ToList();
}
public tblNews GetNews(int tblNewsId)
{
return dbMyNews.tblNews.Include(p => p.tblCategory).FirstOrDefault(p => p.tblNewsId == tblNewsId);
}
این بار اگر پروژه را اجرا کنید با نتیجهای مانند شکل زیر روبهرو خواهید شد:
در بخش هفتم پیرامون میزبانی WCF Library خواهم نوشت.
NHibernate
- آشنایی با NHibernate - قسمت اول
- آشنایی با NHibernate - قسمت دوم
- آشنایی با NHibernate - قسمت سوم
- آشنایی با NHibernate - قسمت چهارم
- آشنایی با NHibernate - قسمت پنجم
- آشنایی با NHibernate - قسمت ششم
- آشنایی با NHibernate - قسمت هفتم
- آشنایی با NHibernate - قسمت هشتم
- آشنایی با NHibernate - قسمت نهم
- آشنایی با NHibernate - قسمت دهم
- معرفی کتاب NHibernate 3 Beginners Guide, Aug 2011
- یکسان سازی ی و ک دریافتی حین استفاده از NHibernate
- NHibernate 3.0 و ارائهی جایگزینی جهت ICriteria API
- NHibernate 3.0 و عدم وابستگی مستقیم به Log4Net
- NHibernate 3.0 و خواص تنبل (lazy properties)!
- مقدار دهی کلیدهای خارجی در NHibernate و Entity framework
- ذخیره سازی SQL تولیدی در NH3
- SQL تولیدی در NHibernate از کدام متد صادر شده است؟
- آیا دیتابیس مورد استفاده در NHibernate با نگاشتهای تعریف شده همخوانی دارد؟
- مدیریت Join در NHibernate 3.0
- بالا بردن سرعت بارگذاری اولیه NHibernate
- سرویس جمع و مفرد سازی اسامی
- NHibernate و سطح اول cache آن
- سطح دوم cache در NHibernate
- اعمال تغییرات سفارشی به ویژگی AutoMapping در Fluent NHibernate
- نحوهی نگاشت فیلدهای فرمول در Fluent NHibernate
- به روز رسانی ارجاعات یک اسمبلی دارای امضای دیجیتال بدون کامپایل مجدد
- مکان اصلی یافتن آخرین نگارشهای Fluent NHibernate
- NH 3.2 و تاثیر آن بر آیندهی FHN
- فعال سازی سطح دوم کش در Fluent NHibernate
- QueryOver در NHibernate و تفاوتهای آن با LINQ to NH
- QueryOver Extensions
- استفاده از Dialect سفارشی در NHibernate
- فیلدهای پویا در NHibernate
- استفاده از فیلدهای XML در NHibernate
- پیاده سازی الگوی واحد کار در NHibernate
- نگاشت IDictionary در Fluent NHibernate
- به روز رسانی اسمبلیهای دارای امضای دیجیتال در VS.NET
- آدرس جدید مخزن کد NHibernate
- NHibernate 3 Beginners Guide
- NHibernate و مدیریت خودکار تغییرات ساختار بانک اطلاعاتی
MDX Query
- آموزش MDX Query - قسمت اول
- آموزش MDX Query - قسمت دوم - نصب و راه اندازی SSAS
- آموزش MDX Query - قسمت سوم - نصب Adventure Work DW و تهیهی پایگاه دادهی Multidimensional Database توسط SSAS
- آموزش MDX Query - قسمت چهارم –آشنایی با AdventureWorksDW2008R2 و آشنایی با محیط BIMS
- آموزش MDX Query - قسمت پنجم – باز کردن یک پایگاه دادهی Multidimensional در محیط BIMS و ساخت یک پروژهی جدید.
- آموزش MDX Query - قسمت ششم – شروع کار با دستورات MDX
- آموزش MDX Query - قسمت هفتم – استفاده از Pivot ، به کارگیری از ساختارهای سلسله مراتبی و به کارگیری Cross Join در کوئری ها
- آموزش MDX Query - قسمت هشتم – کار بر روی ساختارهای سلسله مراتبی
- آموزش MDX Query - قسمت نهم – واکشی اعضا در ساختار سلسله مراتبی دایمنشن ها
- آموزش MDX Query - قسمت دهم – ادامه کار برروی ساختارهای سلسله مراتبی و کار با تابع Cousin و ایجاد Range
- آموزش MDX Query - قسمت یازدهم – استفاده از توابع Lead و Lag
- آموزش MDX Query - قسمت دوازدهم – استفاده از توابع Head , Filter , TopCount , tail
- آموزش MDX Query - قسمت سیزدهم – برخی توابع برای کار روی ساختارهای سلسله مراتبی (prevmember و nextmember)
- آموزش MDX Query - قسمت چهاردهم– Order
- آموزش MDX Query - قسمت پانزدهم – اعمال شرط بر روی خروجی عمل واکشی
- آموزش MDX Query - قسمت شانزدهم – استفاده از تابع Filter در MDX Query ها
- آموزش MDX Query - قسمت هفدهم – توابع Topcount, bottomcount , toppercent, bottompercent, topsum, bottomsum
مقالات آموزشی CLR
فصل اول: مدل اجرای CLR
قسمت اول : آشنایی اولیه با CLR و زبان میانی IL
قسمت دوم: آشنایی اولیه با متادیتاها
قسمت سوم:آشنایی با مفهوم اسمبلی
قسمت چهارم : بارگزاری و اجرای اسمبلی ها
قسمت پنجم:آشنایی با JIT
قسمت ششم:آشنایی بادیباگ کردن و خواص برنامههای CLR
قسمت هفتم : آشنایی با عمل تاییدیه و کدهای ناامن
قسمت هشتم: بررسی ابزار NGen
قسمت نهم: بررسی مفاهیم CLS و CTS
فصل دوم : نحوه ساخت و توزیع اسمبلی ها
قسمت دهم : آشنایی با مسائل توزیع در ویندوز
قسمت یازدهم: تبدیل کد به ماژول و ویژگیهای کمپایلر CSC
قسمت سیزدهم : ترکیب ماژولها به قالب یک اسمبلی
قسمت چهاردهم: ایجاد اسمبلی با استفاده از کمپایلر سی شارپ
قسمت هفدهم : نسخه بندی اسمبلی
قسمت هجدهم : اسمبلی ماهوارهای
قسمت نوزدهم: بسته بندی و انتشار اسمبلی ها
قسمت بیستم: آشنایی با پیکربندی و نحوه اسکن اسمبلیها توسط CLR
قسمت بیست و یکم: معرفی اسمبلی نام قوی
قسمت بیست و دوم : کنترل پیشرفته اسمبلیهای نام قوی با فایل پیکربندی
قسمت بیست و سوم : ساخت فایل پیکربندی برای یک اسمبلی خاص
بخش دوم:طراحی انواع داده ها
فصل چهارم:بنیان و اساس نوع داده ها
قسمت بیست و چهارم: آشنایی با نوع داده آبجکت و خواص آن
قسمت بیست و پنجم: تبدیل نوع داده
مباحث مرتبط
نام قوی Strong Name
NET Just-In-Time Optimization.
توصیه هایی در استفاده از NGEN
فعال سازی Multicore JIT