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

1:data pages اساسی‌ترین واحد نگهداری داده در اس کیوال سرور، صفحه نام دارد. فضای دیسک اختصاص یافته به فایل داده بانک، برای یک بانک اطلاعاتی به صورت منطقی به صفحات پیوسته از صفر تا n تقسیم بندی می‌شود. همچنین لازم به ذکر است عملیات خواندن و یا نوشتن در دیسک، در سطح این صفحه‌ها صورت می‌گیرد که در تصویر زیر قابل مشاهده است:


 لازم به ذکر است در sql server هر صفحه، 8 کیلوبایت است. این مورد به این معنی است که هر بانک اطلاعاتی، دارای 128 صفحه به ازای هر یک مگابایت است. هر صفحه دارای 96 بایت با عنوان header یا سرصفحه است که شامل اطلاعات سیستمی در مورد صفحه است. این اطلاعات سیستمی شامل مواردی چون page number یا شماره صفحه و نوع صفحه یا page type و مقدار فضای خالی آن صفحه و شماره شناسایی یک واحد اختصاص یافته یا به اختصار allocation unit id و.... هستند می‌باشد. نکته جالب و قابل توجه این است که فایل‌های ثبت وقایع یا Log files از صفحه استفاده نمی‌کنند؛ بلکه شامل یکسری رکورد log هستند.
 برای بدست آوردن اطلاعات در مورد فایلهای دیتابیس می‌توانید از کد زیر استفاده نمایید SELECT * FROM sys.database_files که خروجی زیر را به شما نشان می‌دهد:


 extents: به ابتدایی‌ترین قسمتی که sql server امکان مدیریت بر آن را دارد extent گویند. هر extent شامل 8 صفحه‌ی به هم پیوسته است. لازم به ذکر است که sql server هر 1 مگابایت را به شانزده extent اختصاص می‌دهد. sql server شامل دونوع extent است که عبارتند از : uniform,mixed uniform extent متعلق به یک شیء است و هر هشت صفحه‌ی آن فقط توسط یک شیء قابل استفاده‌است. mixed extent می‌تواند حداکثر بین هشت شیء به اشتراک گذاشته شود؛ به نحوی که هر یک از هشت صفحه می‌توانند متعلق به یک شیء باشند. همانطور که در شکل زیر می‌بینید به طور پیش فرض با ایجاد یک جدول، یک mixed extent به آن اختصاص داده می‌شود. در صورتیکه این شیء به اندازه‌ی هشت صفحه رشد کند، به آن یک uniform extent اختصاص داده میشود.


فایلهای بانک اطلاعاتی
هر بانک اطلاعاتی در sql server دارای سه نوع فایل است
فایلهای داده اولیه یا به اختصار primary data files
فایلهای داده‌های ثانویه یا به اختصار secondary data files
فایلهای ثبت وقایع یا به اختصار log file
فایل ثبت وقایع برای نگهداری و ثبت وقایع که برای عملیات recovery مورد نیاز است. معمولا یک بانک اطلاعاتی یک log file دارد؛ ولی می‌تواند بیشتر هم داشته باشد. پسوند این نوع فایلها ldf است .

مطالب
Serialization #1
در این نوشتار به Serialization و Deserialization  یعنی مکانیزمی که توسط آن اشیاء می‌توانند به صورت متنی مسطح و یا به شکل باینری درآیند، پرداخته می‌شود.

مفهوم Serialization
سریالی کردن، عملیاتی است که یک شیء و یا مجموعه اشیائی که به یکدیگر ارجاع می‌دهند را به شکل گروهی از بایت‎ها یا فرمت XML درآورده که می‌توان آن‎ها را ذخیره کرد و یا انتقال داد. 
Deserialization  معکوس عملیات بالاست که گروهی از داده‌ها را دریافت کرده و بصورت یک شیء  و یا مجموعه‌ای از اشیائی که به یکدیگر ارجاع می‌دهند، تبدیل می‌کند.
Serialization و Deserialization  نوعاً برای موارد زیر بکار می‌روند:
  1. انتقال اشیاء از طریق یک شبکه یا مرز یک نرم افزار .
  2. ذخیره اشیاء در یک فایل یا بانک اطلاعاتی.
موتورهای سریالی‌کننده
چهار شیوه برای سریالی کردن در دات نت فریم ورک وجود دارد:
  1. سریالی‌کننده قرارداد داده (Data Contract Serializer)
  2. سریالی‌کننده باینری
  3. سریالی‌کننده XML مبتنی بر صفت
  4. سریالی‌کننده اینترفیس IXmlSerializer
سه مورد اول، موتورهای سریالی‌کننده‌ای هستند که بیشترین یا تقریباً همه کارهای سریالی‌کردن را انجام می‌دهند.  مورد آخر برای انجام مواردی است که خودتان قصد سریالی‌سازی دارید که این موتور با استفاده از XmlReader  و XmlWriter این کار را انجام می‌دهد. IXmlSerializer می‌تواند به همراه سریالی‌کننده قرارداد داده و یا سریالی‌کننده XML در موارد پیچیده سریالی‌کردن استفاده شود.
سریالی‌کننده Data Contract 
برای انجام این کار دو نوع سریالی‌کننده وجود دارد :
  1. DataContractSerializer، که اصطلاحاً loosely Coupled شده است به نوع سریالی‌کننده  Data Contract.
  2. NetDataContractSerializer که اصطلاحاً tightly Coupled شده است به نوع سریالی‌کننده  Data Contract.
مدل زیر را در نظر بگیرید:
public class News
    {
        public int Id;
        public string Body;
        public DateTime NewsDate;
    }
برای سریالی‌کردن نوع News به شیوه  Data Contract، باید:
  1. فضای نام System.Runtime.Serialization را به کد برنامه اضافه کنیم.
  2. صفت [DataContract] را به نوعی که تعریف کرده‌ایم، اضافه کنیم.
  3. صفت [DataMember] را به اعضایی که می‌خواهیم در سریالی شدن شرکت‌کنند، اضافه کنیم.
و به این ترتیب کلاس News به شکل زیر درمی‌آید:
using System.Runtime.Serialization;
using System.Xml;
using System;
using System.IO;
namespace ConsoleApplication1
{  
    [DataContract]
    public class News
    {
        [DataMember] public int Id;
        [DataMember] public string Body;
        [DataMember] public DateTime NewsDate;
    }
}
سپس به شکل زیر از مدل خود نمونه‌ای ساخته و با ایجاد یک فایل، نتیجه سریالی شده مدل را در آن ذخیره میکنیم .
var news = new News
                           {
                               Id = 1,
                               Body = "NewsBody",
                               NewsDate = new DateTime(2012, 10, 4)
                           };
 var ds = new DataContractSerializer(typeof (News));
 using (Stream s=File.Create("News.Xml"))
 {
        ds.WriteObject(s, news);//سریالی‌کردن
 }
که محتویات فایل News.Xml به صورت زیر است:
<News xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication7" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Body>NewsBody</Body><Id>1</Id><NewsDate>2012-10-04T00:00:00</NewsDate></News>
و برای Deserialize  کردن این فایل داریم:
News deserializednews;
using (Stream s = File.OpenRead("News.Xml"))
{
       deserializednews = (News)ds.ReadObject(s);//Deserializing
}
Console.WriteLine(deserializednews.Body);
همان‌طور که ملاحظه می‌کنید فایل ایجاد شده از خوانایی خوبی برخوردار نیست که برای دستیابی به فایلی با خوانایی بالاتر از XmlWriter استفاده میکنیم:
XmlWriterSettings settings = new XmlWriterSettings {Indent = true}; 
using (XmlWriter writer = XmlWriter.Create("News.Xml", settings))
{
          ds.WriteObject(writer, news);
}
System.Diagnostics.Process.Start("News.Xml");
به این ترتیب موفق به ایجاد فایلی با خوانایی بالاتر می‌شویم:
<?xml version="1.0" encoding="utf-8"?>
<News xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication7">
  <Body>NewsBody</Body>
  <Id>1</Id>
  <NewsDate>2012-10-04T00:00:00</NewsDate>
</News> 
نظرات مطالب
مفاهیم برنامه نویسی ـ آشنایی با سازنده‌ها
تشکر. همانطور که گفته شد بلافاصله پس از تخصیص حافظه به شیء سازنده اجرا می‌شود. در صورت استفاده از سازنده پارامتر دار کد مشتری از ابتدا شیء را با مقادیر عملیاتی خود ایجاد می‌کند.
مطالب
روش ترجیح داده شده‌ی مقایسه مقادیر اشیاء با null از زمان C# 7.0 به بعد
روش سنتی بررسی نال بودن اشیاء و متغیرها در زبان #C، استفاده از اپراتور == است:
if(person == null) { }
اما از زمان C# 7.0 و معرفی pattern matching، از واژه‌ی کلیدی is نیز می‌توان برای اینکار استفاده کرد (که به آن constant pattern هم می‌گویند):
if(person is null) { }
اکنون سؤال اینجا است که امروز بهتر است از کدامیک استفاده کنیم؟


سربارگذاری عملگرها و مقایسه‌ی وهله‌های اشیاء با null

در عمل، تفاوتی بین استفاده‌ی از عملگر == و واژه‌ی کلیدی is برای بررسی نال بودن وهله‌ای از یک شیء وجود ندارد؛ اما ... با یک شرط! فقط در حالتیکه عملگر == سربارگذاری نشده باشد.
برای نمونه کلاس Person زیر را در نظر بگیرید که عملگرهای == و =! آن بازنویسی شده‌اند:
public class Person
{
  public static bool operator ==(Person x, Person y)
  {
    return false;
  }
  public static bool operator !=(Person x, Person y)
  {
    return !(x == y);
  }
  public override bool Equals(object obj)
  {
    return base.Equals(obj);
  }
}
در این حالت اگر قطعه کد زیر را اجرا کنیم که در یک سطر آن، وهله‌ی person که مقدار نال را دارد، توسط عملگر == با null مقایسه شده‌است و در سطر بعدی با کمک واژه‌ی کلیدی is با نال مقایسه شده‌است:
Person person = null;
Console.WriteLine("Is Person null?");
Console.WriteLine($"== says: {person == null}");
Console.WriteLine($"is says: {person is null}");
به نظر شما خروجی این قطعه کد چیست؟
اگر در کلاس Person سربارگذاری عملگر == صورت نمی‌گرفت، خروجی زیر را مشاهده می‌کردیم:
Is Person null?
== says: True
is says: True
اما اینبار خروجی واقعی قطعه کد فوق، با چیزی که انتظار داریم متفاوت است:
Is Person null?
== says: False
is says: True
مزیت کار با واژه‌ی کلیدی is، صرفنظر کردن از operator overloads یا همان سربارگذاری عملگرها است. در حین حالت فقط مقدار person، با null مقایسه می‌شود و دیگر، کار به بررسی خروجی false زیر نمی‌رسد (کاری که با استفاده از عملگر == حتما انجام خواهد شد):
public static bool operator ==(Person x, Person y)
{
   return false;
}
به عبارتی استفاده‌ی از عملگر == جهت مقایسه‌ی با null، حتما نیاز به بررسی کدهای کلاس Person را جهت مشاهده‌ی کدهای تغییر یافته‌ی عملگر == را نیز دارد؛ اما زمانیکه از وژه‌ی کلیدی is استفاده می‌کنیم، مقصود اصلی ما را که بررسی مقدار جاری با null است، برآورده می‌کند (و در 99 درصد موارد، ما هدف دیگری را دنبال نمی‌کنیم و برای ما مهم نیست که عملگر == سربارگذاری شده‌است یا خیر). همچنین سرعت مقایسه در حالت استفاده از واژه‌ی کلیدی is نیز بیشتر است؛ چون دیگر فراخوانی کدی که عملگر == را سربارگذاری می‌کند، صورت نخواهد گرفت و از زمان C# 9.0، برای حالت بررسی حالت عکس آن می‌توان از  if (obj is not null) نیز استفاده کرد (بجای if (!(obj is null))) که از حالت سربارگذاری عملگر =! صرفنظر می‌کند.


یک نکته: null coalescing operator یعنی ?? و null coalescing assignment operator یعنی =?? نیز همانند واژه‌ی کلیدی is عمل می‌کنند. یعنی از == سربارگذاری شده صرفنظر خواهند کرد.
نظرات مطالب
پیاده سازی پروژه نقاشی (Paint) به صورت شی گرا 3#

چرا drawpreview به صورت استاتیک تعریف شده؟ چرا دوبار تعریف شده؟ و چرا این کلاس پایه اطلاعات زیادی در مورد رسم زیر مجموعه‌های خودش داره؟ آیا بهتر نیست جرئیات ترسیم هر شیء با override شدن به زیر کلاس‌های مشتق شده واگذار بشن؟ چرا این متدها از خاصیت‌های کلاس تعریف شده استفاده نمی‌کنن و دوباره این خاصیت‌ها رو به صورت پارامتر دریافت کردن؟ (همون بحث اعلام استقلال متد تعریف شده به صورت استاتیک و اینکه چرا؟) و اگر این کلاس پایه تا این اندازه لازم هست در مورد رسم دایره و سایر اشکال اطلاعات داشته باشد، چه ضرورتی به abstarct بودن آن هست؟ اصلا چه ضرورتی به تعریف اشیاء مشتق شده از آن هست؟

اشتراک‌ها
پایتون و VSCode

«...اگر برنامه نویس پایتون باشید حتما محیط Pycharm را بهترین و راحت‌ترین گزینه برنامه نویسی با این زبان می‌دانید. اما در چند سال اخیر حضور قدرتمند Visual Code را نمی‌توانید نادیده بگیرید...» 

پایتون و VSCode