برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

آشنایی با سخت افزار


واحد پردازش مرکزیCPU
این بخش یک مدار الکترونیکی گسترده وپیچیده است که به انجام دستورات بر نامه های ذخیره شده می پردازد دارای دو بخش است که عبارتند از
واحد کنترل و واحد محاسبه ومنطق
ازچهار بخش ذخیره سازی موقت برای ذخیرهء دستورها و یا داده ها استفاده میکند این مناطق حافظهء موقتcpu
نام دارندRegister
ثباتهای مختلف وظایف متفاوتی را انجام می دهند برای مثال ثبات آدرس مکان ذخیره شدن یک دستور ویا معمولآ نتایج محاسبات را (
Accumulator
)یک قطعه دادهای را در حافظه دنبال می کند وثبات انباشتگر
جمع آوری می نماید

:واحد کنترل

این بخش تمام سیستم کامپیوتر را به نحوی هدایت می کند که دستورات بر نامه های ذخیره شده را انجام دهند
این بخش باید بتواند با دو بخش واحد محاسبه ومنطق وحافظه ارتباط برقرار کند

:(Alu)واحد محاسبه ومنطق

کار این بخش انجام توابع حسابی مقایسه ای ومنطقی است توابع حسابی شامل جمع، تفریق ، ضرب وتقسیم می شوند عملیات منطقی به مقایسهء اعداد ، حروف وخصوصیات ویژه می پردازد این عملیات سه نوع شرایط را مورد آزمایش قرار می دهد


:شرایط مساوی
در این شرایط دو مقداربا هم برابر هستند
:شرایط کوچکتر
در این شرایط یک مقداراز مقدار دیگر کمتر است
:شرایط بزرگتر
در این شرایط یک مقدار از یک مقدار دیگر بیشتر است
برای توصیف توابع مقایسه ای استفاده می کند(=،<،>)از علایم Aluواحد

:توجه
 واحد پردازش مرکزی را که بر روی تنها یک تراشه قرار دارد به طور مختصر ریز پردازنده و یا 

 PII-333 - 486-DX     ریز تراشه می نامند مانند ریز پردازنده های

 وقتی از یک ریز پردازنده برای کنترل وسایل بخصوصی مانند سیستم های سوختی موجود در یک -
Intel 8096
ماشین استفاده می شود  به آن تراشهء منطقی ویا میکرو کنترلر های

توانایی معماری پردازنده های پنتیوم شرکت اینتل را بهبود بخشیده(Multimedia extensions)
MMXتراشهء
و عملکرد بر نامه های کاربردی چند رسانه ای و مخابراتی که دارای ویژگیهای گرافیکی ، تصویری
وصوتی را افزایش میدهد



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


حافظه ءنیمه رسانا

 بسیاری از کامپینتر های جدید از حافظه های نیمه رسانا استفاده می کنند و علت آن هم مزایای چندی است
 که این نوع حافظه ها دارند از جملهء این مزایا می توان به قابل اطمینان بودن ، فشردگی ، ارزانی و مصرف کم انرژی اشاره کرد
ارزانی این نوع حافظه ها به خاطر تولیدانبوه آن می باشد که موجب کاهش قیمت این نوع حافظه ها شده است
عیب این نوع حافظه هابی ثباتی آنهاست چون این حافظه های نیمه رسانا برای ارایهءداده ها به جریان الکتریسیتهء پیوسته ای نیازدارند اگر جریان الکتریسیته قطع  شود داده ها نیز از دست می روند
 حافظه ء نیمه رسانا از هزاران مدار کوچک که مسیرهایی برای عبور جریان الکتریسیته هستند ساخته شده است
این مدارها بر روی یک تراشه از جنس سیلیکون قرار گرفته اند یک نوع شناخته شده از طراحی نیمه نام    وNیکی از نو
ع MOSFETدارد در این فن آوری نیمه رسانا از دو ترانزیستور نیمه هادیCMOSرسانا
استفاده شده است که بر روی یک تراشهء سیلیکون واحد جای می گیرند اینگونه از طراحیPودیگری نوع
حافظه انرژی آنها بسیار اندک است و از این رو برای کامپیوتر های قابل حمل مناسب می باشند


RAM    ROM

یا حافظه دستیابی تصادفی تمام دستورات وداده های مربوط به بر نامه ای که در حال اجرا هستند را نگهداری می کندRAM

می تواند توسط نرم افزارهای کامپیوتر پاک و یا رو نویسی شود  RAM
 موجود بر روی کامپیوتر های شخصی را می توان  با استفاده از تراشه های حافظه خارجی و یا با RAM
      افزایش داد  SIMM نصب حافظهء 
:دارای دو نوع استRAMبرد مدار کوچکی است که محتوی تراشه های حافظه ای است معمولآSIMM
استاتیکRAM: SRAM
دینامیکRAM:DRAM
به طور پیوسته باز سازی  شود والا محتوی خود را از دست می دهدو به همین CPUپویا باید توسط RAM
 پویا یا دینامیک گفته می شود RAM
دلیل است که به این نوع 
دینامیک بخاطر کوچکی و
RAMاستاتیک سریع تر است اما در کامپیوترهای شخصی از RAMا
گر چه
ارزان تر بودن آن بیشتر استفاده میشود

:(حافظهء فقط خواندنی)ROM

این حافظه شامل برنامه هاو داده هایی است که توسط شرکت سازنده به طور دایمی در آن نوشته شده است این 
حافظهROMداده ها می توانند خوانده ویا استفاده شونداما کاربر نمی تواند آنها را تغییر دهد در حقیقت 
نامتغییر است

نام دارند میتوان دستورات موجود در داخل برخی
ROM BURNERS 
البته با ابزار ویژه ای که
 را تغییر داد
ROMا
ز تراشه های 

می نامندتراشه های حافظهای فقط خواندنی با قابلیت بر نامه ریزی شدن
PROMاین تراشه های تغییر دادنی را 

حافظهء پنهان

حافظه پنهان مقدار کوچکی از حافظه بسیار سریع است که برای مقاصد بخصوصی  چون افزایش سرعت داخلی داده ها و دستورات نرم افزاری طراحی شده است
این سیستم فرعی حافظه از مقادیر دادهای پر استفاده نسخه بردازی نی کند  تا برای دسترسیسریع آماده باشند
که بیشتر مورد استفاده قرار می گیرند را ذخیره نموده و
RAM
حافظه ء پنهان محتویات مکانهایی از
و جاهایی را که این اقلام داده ای ذخیره می شوند را آدرس دهی می کنند 
وقتی پردازنده به آدرسی در حافظه ارجاع می کند حافظه پنهان وارسی می کند که آیا چنین آدرسی را دارد یا نه اگر آدرسی داشته باشد داده به پردازنده برگشت داده می شودو اگر چنین آدرسی نداشته باشد یک دسترسی به حافظهء عادی اتفاق می افتد حافظه پنهانی دارای دو نوع داخلی و خارجی است حافظه پنهانی داخلی بر روی معماری خود پردازنده تعبیه شده است در حالی که خافظه پنهانی خارجی بر روی یک تراشه مجزا قرار دارد

سرعت و قدرت یک کامپیوتر
سرعت یکی از ویژگیهایی است که هنگام انتخاب کامپیوتر به آن توجه می شود البته قدرت نیز مشتق از سرعت و بسیاری از عوامل دیگر مانند اندازهء حافظه است

سرعت پردازش کامپیوتر
کامپیوتر های مختلف دارای سرعتهای پردازش متفاوتی هستند گاهی انجام یک دستور معین در یک کامپیوتر کند یک هزارم ثانیه طول می کشد در صورتی که همین دستور در کامپیوترهای سریع می تواند در یک میلینیوم ثانیه یا یک بیلینیوم ثانیه انجام شود و حتی در انواع خیلی سریعتر در یک تریلیونیم ثانیه انجام شود
سرعت ریز پردازنده ها را معمولآ بر اساس مگا هرتز نشان می دهندو منظور از آن تعداد دوری است که یک وسیله می توانددر ثانیه بچرخد یکی از واحدهای دیگری که برای سنجش سرعت کامپیوتر استفاده می است
MIPS
شود
معادل یک میلیون دستور در ثانیه است سومین واحدی که برای سنجش سرعت استفاده می شود
MIPS
هر 
مگا فلاپ  استو منظور از آن یک میلیون عمل اعشاری در ثانیه  می باشد از این واحد برای سنجش توانایی کامپیوتر در انجام عملیات پیچیده ریاضی استفاده می شود
خطوط گذرگاهی
هر خط گذر گاهی مجموعه ای از مسیرهای الکترونیکی موازی است که به طور داخلی داده ها دا درون سیستم از یک مکان به مکان دیگری می برد مقدار دادهای که در هر بار می تواند حمل شود پهنای گذر گاه نام دارد پهنای گذر گاه نشان دهندهءتعداد مسیرهای الکترونیکی است
هر چه پهنای گذر گاه بیشتر باشد در نتیجه کامپیوتر قوی تر است وجود پهنای گذر گاه بزرگ می تواند مفاهیم زیر را به همراه داشته باشد
کامپیوتر در یک زمان معین می تواند داده های بیشتری را منتقل کند که این موجب بالا رفتن سرعت کامپیوتر  می شودکامپیوتر می تواند از دستورات متنوع بیشترو بزرگتری پشتیبانی کند

 

آموزش سخت افزار ۱

کارت صدا(۱) Sound Card کارت صدا یکی از عناصر سخت افزاری رایانه است که باعث پخش و ضبط صدا می گردد. قبل از گسترش کارت های صدا، صدا در رایانه توسط بلند گوهای داخلی ایجاد می شد. این بلند گوها توان خود را از برد اصلی می گرفتند. استفاده از کارت صدا از اواخر سال ۱۹۸۰ شروع شد. در حال حاضر شرکت های متعددی تولیدات خود را در این زمینه به بازار عرضه می کنند. کارت صوتی همانند کارت گرافیکی بر روی برد اصلی نصب می شود و در پشت آن چند فیش برای میکروفن و بلند گو قرار دارد. وظیفه کارت صدا آماده سازی سیگنال ها جهت پخش و دریافت سیگنال های ورودی از میکروفن و آماده کردن آنها برای ذخیره در رایانه است. کارت صدا، کارت صوتی نیز نامیده می شود و در بسیاری موارد می تواند اصواتی با کیفیت بسیار عالی تولید کند. صوت، یک سیگنال آنالوگ است که به صورت موج پیوسته انتشار می یابد. رایانه همواره در حال پردازش سیگنال های آنالوگ است، زیرا این سیگنال ها دائماً در حال تغییرند. در واقع لازم است که سیگنال های آنالوگ به بیت های رقمی (دیجیتال) تبدیل شوند. این عمل توسط وسیله ای به نام Analog to Digital Convertor ADC)) صورت می گیرد. سیگنال های دیجیتالی تولید شده مجدداً باید به سیگنال های آنالوگ تبدیل شوند تا بتوانند به وسیله بلند گو پخش شوند. این عمل توسط سخت افزار دیگری به نام DACصورت می گیرد. صداهای دیجیتال به فضای زیادی بر روی دیسک نیاز دارد. بنابراین به جای ذخیره صدا آن را ایجاد می کند. این عملیات شبیه سازی صوتی نام دارد و به روش های زیر صورت می گیرد: FM -1(مدولاسیون بسامد): این روش به صورت کاملاً مصنوعی صدا را ایجاد می کند و برای ساخت آن از دو موج سینوسی استفاده می کند. ۲- جدول موجی (صدای موجی): این روش کم هزینه و واقعی تر است. در این حالت از تمامی وسایل موسیقی نمونه گیری شده است و صدای دیجیتالی تولید شده در یک جدول موج ذخیره شده است. در صورتی که یک برنامه به صدایی احتیاج داشته باشد این جدول موج چه در کارت صدا و چه در دیسک، صدای واقعی را به برنامه می دهد. فایل های صوتی با پسوند Wav در ویندوز صداهای واقعی هستند که از جدول موج استفاده می کنند. بنابراین آهنگسازان حرفه ای ترجیح می دهند این گونه کارت های صدا را استفاده نمایند. این صداها در تراشه های رام کارت صوتی ذخیره می شوند و در نتیجه بسیاری از تولید کنندگان بزرگ بودن حافظه جدول صوتی را دلیل مرغوب بودن کارت صدا می دادند. ۳- ) MIDIرابط دیجیتالی ادوات موسیقی): این روش برخلاف روش قبلی صدای تولید شده را ضبط نمی کند، بلکه اطلاعات صدا مانند کوک، دوام، بلندی و سایر موارد را ضبط می کند. این اطلاعات در یک قالب استاندارد در فایل ذخیره می شود و یا به یک وسیله موسیقی جهت اجرا ارسال می شود. بنابراین یک فایل MIDI مجموعه ای از دستور العمل ها در مورد چگونگی اجرای نت هاست. نکته: فایل های MIDI جهت برقراری ویدئو کنفرانس ها و پخش فیلم در اینترنت به کار می روند. ۴- نمونه سازی فیزیکی:این روش نسبتاً جدید است و بسته به نوع ساز شبیه سازی شده است. با اینکه دارای صدای خوبی است اما بار زیادی بر پردازنده اصلی وارد می سازد. اجزای تشکیل دهنده کارت صدا - پردازنده سیگنال های دیجیتال که عملیات مورد نظر را انجام می دهند. - مبدل آنالوگ به دیجیتال (ACD) برای صوت ورودی به رایانه - مبدل دیجیتال به آنالوگ (DAC) - حافظه ROM یا فلش جهت ذخیره سازی اطلاعات - اینترفیش دستگاه های موزیکال دیجیتالی (MIDI) جهت اتصال دستگاه های موزیک خارجی - کانکتورهای لازم جهت اتصال به میکروفن یا بلند گو - پورت مخصوص بازی برای اتصال Joystick کارت های صوتی قدیمی عمدتاً از نوع ISA بوده اند، اما کارت صداهای امروزی از نوع PCI هستند که بر روی برد اصلی نصب می گردند. بیشتر مادربردها در حال حاضر کارت صدا را به صورت یک تراشه بر روی برد اصلی دارند. انواع اتصال کارت صدا به رایانه - بلند گو (Speaker) - یک منبع ورودی آنالوگ (میکروفن ضبط صوت و CD-Player) - یک منبع ورودی دیجیتال نظیر CD-ROM - یک منبع آنالوگ خروجی نظیر ضبط صوت - یک منبع دیجیتال خروجی شنیدن صوت مراحل شنیدن صوت بر خلاف روش تولید صدا می باشد که در زیر شرح داده شده است: ۱- داده های دیجیتال از هارددیسک خوانده می شود و سپس در اختیار پردازنده اصلی قرار می گیرد. ۲- پردازنده اصلی داده ها را برای DSP موجود بر روی کارت صدا ارسال می کند. 3- DSP داده های دیجیتال را از حالت فشرده خارج می کند. ۴- داده های دیجیتال غیر فشرده شدن توسط DSP بلافاصله با مبدل دیجیتال به آنالوگ (DAC) پردازش و یک سیگنال آنالوگ ایجاد می کنند. این سیگنال های ایجاد شده از طریق هدفن یا بلند گو شنیده خواهد شد. http://iritn.com/index.php?action=show&type=news&id=3572

موتور جستجو چگونه کار می کند؟

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

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

  • Spider یا عنکبوت
  • Crawler یا خزنده
  • Indexer یا بایگانی کننده
  • Database یا پایگاه داده
  • Ranker یا سیستم رتبه بندی


الف Spider- (عنکبوت)
اسپایدر یا روبوت (Robot)، نرم افزاری است که کار جمع آوری اطلاعات مورد نیاز یک موتور جستجوگر را بر عهده دارد. اسپایدر به صفحات مختلف سر می زند، محتوای آنها را می خواند، لینکها را دنبال می کند، اطلاعات مورد نیاز را جمع آوری می کند و آنرا در اختیار سایر بخش های موتور جستجوگر قرار   می دهد. کار یک اسپایدر، بسیار شبیه کار کاربران وب است. همانطور که کاربران، صفحات مختلف را بازدید می کنند، اسپایدر هم درست این کار را انجام می دهد با این تفاوت که اسپایدر کدهای HTML صفحات را می بیند اما کاربران نتیجه حاصل از کنار هم قرار گرفتن این کدها را. index.html صفحه ای است که کاربران آنرا به صورت شکل (1) می بینند:

شکل 1- نمونه ای از صفحات وب که توسط مرورگرها نشان داده می شود.

اما یک اسپایدر آنرا چگونه می بیند؟
برای این که شما هم بتوانید دنیای وب را از دیدگاه یک اسپایدر ببینید، کافی است که کدهای HTML صفحات را مشاهده کنید. برای این کار در مرورگر مورد استفاده خود، مسیر نشان داده شده در شکل (2) دنبال کنید. 

شکل 2- روش مشاهده کدهای HTML یک صفحه وب

با انجام این کار فایل متنی شکل (3)  به شما نشان داده می شود:

شکل 3- کدهای HTML سازنده یک صفحه وب

آیا این دنیای متنی برای شما جذاب است؟ 

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

اسپایدرها کاربردهای دیگری نیز دارند، به عنوان مثال عده ای از آنها به سایت های مختلف مراجعه می کنند و فقط به بررسی فعال بودن لینک های آنها می پردازند و یا به دنبال آدرس ایمیل (Email) می گردند.

ب- Crawler (خزنده)
کراولر، نرم افزاری است که به عنوان یک فرمانده برای اسپایدر عمل می کند. آن مشخص می کند که اسپایدر کدام صفحات را مورد بازدید قرار دهد. در واقع کراولر تصمیم  می گیرد که کدام یک از لینک های صفحه ای که اسپایدر در حال حاضر در آن قرار دارد، دنبال شود. ممکن است همه آنها را دنبال کند، بعضی ها را دنبال کند و یا هیچ کدام را دنبال نکند.

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

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

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

در حقیقت ایندکسر، صفحه را به پارامترهای آن خرد می کند و تمام این پارامترها را به یک مقیاس عددی تبدیل می کند تا سیستم رتبه بندی بتواند پارامترهای صفحات مختلف را با هم مقایسه کند. در زمان تجزیه و تحلیل اطلاعات، ایندکسر برای کاهش حجم داده ها از بعضی کلمات که بسیار رایج هستند صرفنظر می کند. کلماتی نظیر a ، an ، the  ، www ، is و ... . از این گونه کلمات هستند.

د - DataBase (پایگاه داده)
تمام داده های تجزیه و تحلیل شده در ایندکسر، به پایگاه داده ارسال می گردد. در این بخش داده ها گروه بندی، کدگذاری و ذخیره می شود. همچنین داده ها قبل از آنکه ذخیره شوند، طبق تکنیکهای خاصی فشرده می شوند تا حجم کمی از پایگاه داده را اشغال کنند. یک موتور جستجوگر باید پایگاده داده عظیمی داشته باشد و به طور مداوم حجم محتوای آنرا گسترش دهد و البته اطلاعات قدیمی را هم به روز رسانی نماید. بزرگی و به روز بودن پایگاه داده یک موتور جستجوگر برای آن امتیاز محسوب می گردد. یکی از تفاوتهای اصلی موتورهای جستجوگر در حجم پایگاه داده آنها و همچنین روش ذخیره سازی داده ها در پایگاه داده است.

و- Ranker (سیستم رتبه بندی)
بعد از آنکه تمام مراحل قبل انجام شد، موتور جستجوگر آماده پاسخ گویی به سوالات کاربران است. کاربران چند کلمه را در جعبه جستجوی (Search Box) آن وارد می کنند و سپس با فشردن Enter منتظر پــاسخ می مانند. برای پاسخگویی به درخواست کاربر، ابتدا تمام صفحات موجود در پایگاه داده که به موضوع جستجو شده، مرتبط هستند، مشخص می شوند. پس از آن سیستم رتبه بندی وارد عمل شده، آنها را از بیشترین ارتباط تا کمترین ارتباط مرتب می کند و به عنوان نتایج جستجو به کاربر نمایش می دهد.

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

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

می توان با ادغام کردن اسپایدر با کراولر و همچنین ایندکسر با پایگاه داده، موتور جستجوگر را شامل سه بخش زیر دانست که این گونه تقسیم بندی هم درست می باشد:

  • کراولر
  • بایگانی
  • سیستم رتبه بندی

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

برای آنکه تصور درستی از نحوه کار یک موتور جستجوگر داشته باشید داستان نامتعارف زیر را با هم بررسی می کنیم. داستان ما یک شکارچی دارد. او تصمیم به شکار می گیرد:

-  کار کراولر:
او  قصد دارد برای شکار به منطقه حفاظت شده ابیورد، واقع در شهرستان درگز (شمالی ترین شهر خراسان بزرگ) برود.

-  پروتکل Robots :
ابتدا تمام محدودیت های موجود برای شکار در این منطقه را بررسی می کند:

  •  آیا در این منطقه می توان به شکار پرداخت؟
  • کدام حیوانات را می توان شکار کرد؟
  • حداکثر تعداد شکار چه میزانی است؟ 
  • و ... .

فرض می کنیم او مجوز شکار یک اوریال (نوعی آهو) را از شکاربانی منطقه دریافت می کند.

-  کار اسپایدر
او اوریالی رعنا را شکار می کند و سپس آنرا با خود به منزل می برد.

- کار ایندکسر
شکار را تکه تکه کرده، گوشت، استخوان، دل و قلوه، کله پاچه و ... آنرا بسته بندی می کند و بخش های زاید شکار را دور می ریزد.

-  کار پایگاه داده
بسته های حاصل را درون فریزر قرار داده، ذخیره می کند. 

- کار سیستم رتبه بندی
مهمانان سراغ او می آیند و همسرش بسته به ذائقه مهمانان برای آنها  غذا طبخ می کند. ممکن است عده ای کله پاچه، عده ای آبگوشت، عده ای ... دوست داشته باشند. پخت غذا طبق سلیقه مهمانان کار سختی است. ممکن است همه آنها آبگوشت بخواهند اما آنها مسلما" بامزه ترین آبگوشت را می خواهند!

نکته ها:

  • شکارچی می توانست برای شکار کبک یا اوریال و یا هر دو به آن منطقه برود همانطور که موتور جستجوگر می تواند از سرور سایت شما انواع فایل (عکس، فایل متنی، فایل اجرایی و ...) درخواست کند.
  • شکارچی می تواند شب به شکار برود یا روز. موتور جستجوگر هم ممکن است شب به سایت شما مراجعه کند یا روز. بنابراین همواره مطمئن باشید که سایت شما آپ است و موتور جستجوگر می تواند در آن به شکار فایلها بپردازد.
  • غذای خوشمزه را می توانید با نتایج جستجوی دقیق و مرتبط مقایسه کنید. اگر شکارچی بهترین شکار را با خود به منزل ببرد اما غذایی خوشمزه و مطابق سلیقه مهمانان طبخ نگردد، تمام زحمات هدر رفته است.
  • به عنوان آخرین نکته این بخش یاد آوری می کنم که به شکار اوریالی رعنا آن هم در منطقه حفاظت شده ابیورد (پارک ملی تندوره) اصلا فکر نکنید. اما توصیه می شود که حتما از طبیعت بکر آن دیدن فرمایید (بدون اسلحه!).

انواع رابطه ها در پایگاه داده

 

» همانگونه که میدانید یک فیلد می تواند از چندین رکورد و یک جدول از چند فیلد تشکیل شود ، با توجه به این مطلب یک پایگاه داده هم میتواند دارای چندین جدول باشد . حال هر یک از این جدول ها می توانند اطلاعاتی را در خود ذخیره کنند که با جدول دیگری در ارتباط باشد یا این که هیچگونه ارتباطی را بین آنها قایل نشویم . برای مثال ما جدولی داریم مخصوص نگهداری اطلاعات فردی افراد و در جدول دیگری اطلاعات مالی این افراد را نگهداری میکنیم . بدون شک باید بین این دو جدول ارتباطی وجود داشته باشد تا ما تشخیص دهیم که کدام اطلاعات مربوط به کدام فرد است . وظیفه برقراری این ارتباط بر عهده فیلد کلید یا ( Primary Kay )است که خود ما آن را تعیین میکنیم .

 

» معمولا هر جدول یک فیلد موسوم به فیلد کلید KeyField دارد که از آن برای حفظ یکپارچگی پایگاه داده و برقراری رابطه با جدول های دیگر استفاده می کند . هر جدول می تواند فقط یک فیلد کلید یا کلید اولیه داشته باشد ، ولی می تواند دارای چند فیلد خارجی Foreign Key باشد . نحوه نمایش داده ها را فیلد کلید اصلی کنترل می کند و از فیلد خارجی برای مرتب کردن جدول با جدول های دیگر استفاده می شود .

 

» برای ایجاد ارتباط بین جدول ها در محیط Access شما باید از منوی Tools گزینه Relationships را انتخاب کنید و پس از انتخاب جدول ها خواهید توانست بین آنها توسط فیلدهای کلید ارتباط با معنی ایجاد کنید .

 

_ ما توسط فیلد کلید می توانیم انواع روابط زیر را بین جدول ها ایجاد کنیم :

 

» رابطه یک به یک : در این نوع ارتباط فیلدی در جدول اول یا اصلی به عنوان فیلد کلید تعریف می شود و با فیلد دیگری که در جدول بعدی یا فرعی به عنوان فیلد کلید تعریف شده است ارتباط داده می شود . در این صورت اطلاعات موجود در فیلد جدول فرعی باید کاملا مشابه اطلاعات و داده های موجود در فیلد کلید اصلی اصلی باشد . یعنی برای هر رکورد موجود در فیلد کلید اصلی باید رکورد متناظر با آن در فیلد کلید فرعی موجود باشد . و نمی تواند رکورد تکراری در هر یک از جدول ها وجود داشته باشد .

 

 

 

» رابطه یک به چند : در این نوع ارتباط فیلد اشاره گر می تواند به چند رکورد در جدول های دیگر اشاره کند یا این که برای هر رکورد موجود در فیلد کلید اصلی چند رکورد متناظر با آن در جدول های دیگر موجود باشد .

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

 

نکته : ارتباط یک به چند مهمترین و پر کاربرد ترین ارتباط موجود در میان جدول ها محسوب میشود .

 

 

 

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

 

خلاصه مطلب : ساخت برنامه هایی که از پایگاه داده در سطح گسترده ای استفاده می کنند بدون ایجاد ارتباط بین جدول ها توسط فیلد های کلید امکان پذیر نیست .

انواع رابطه ها در پایگاه داده

 

» همانگونه که میدانید یک فیلد می تواند از چندین رکورد و یک جدول از چند فیلد تشکیل شود ، با توجه به این مطلب یک پایگاه داده هم میتواند دارای چندین جدول باشد . حال هر یک از این جدول ها می توانند اطلاعاتی را در خود ذخیره کنند که با جدول دیگری در ارتباط باشد یا این که هیچگونه ارتباطی را بین آنها قایل نشویم . برای مثال ما جدولی داریم مخصوص نگهداری اطلاعات فردی افراد و در جدول دیگری اطلاعات مالی این افراد را نگهداری میکنیم . بدون شک باید بین این دو جدول ارتباطی وجود داشته باشد تا ما تشخیص دهیم که کدام اطلاعات مربوط به کدام فرد است . وظیفه برقراری این ارتباط بر عهده فیلد کلید یا ( Primary Kay )است که خود ما آن را تعیین میکنیم .

 

» معمولا هر جدول یک فیلد موسوم به فیلد کلید KeyField دارد که از آن برای حفظ یکپارچگی پایگاه داده و برقراری رابطه با جدول های دیگر استفاده می کند . هر جدول می تواند فقط یک فیلد کلید یا کلید اولیه داشته باشد ، ولی می تواند دارای چند فیلد خارجی Foreign Key باشد . نحوه نمایش داده ها را فیلد کلید اصلی کنترل می کند و از فیلد خارجی برای مرتب کردن جدول با جدول های دیگر استفاده می شود .

 

» برای ایجاد ارتباط بین جدول ها در محیط Access شما باید از منوی Tools گزینه Relationships را انتخاب کنید و پس از انتخاب جدول ها خواهید توانست بین آنها توسط فیلدهای کلید ارتباط با معنی ایجاد کنید .

 

_ ما توسط فیلد کلید می توانیم انواع روابط زیر را بین جدول ها ایجاد کنیم :

 

» رابطه یک به یک : در این نوع ارتباط فیلدی در جدول اول یا اصلی به عنوان فیلد کلید تعریف می شود و با فیلد دیگری که در جدول بعدی یا فرعی به عنوان فیلد کلید تعریف شده است ارتباط داده می شود . در این صورت اطلاعات موجود در فیلد جدول فرعی باید کاملا مشابه اطلاعات و داده های موجود در فیلد کلید اصلی اصلی باشد . یعنی برای هر رکورد موجود در فیلد کلید اصلی باید رکورد متناظر با آن در فیلد کلید فرعی موجود باشد . و نمی تواند رکورد تکراری در هر یک از جدول ها وجود داشته باشد .

 

 

 

» رابطه یک به چند : در این نوع ارتباط فیلد اشاره گر می تواند به چند رکورد در جدول های دیگر اشاره کند یا این که برای هر رکورد موجود در فیلد کلید اصلی چند رکورد متناظر با آن در جدول های دیگر موجود باشد .

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

 

نکته : ارتباط یک به چند مهمترین و پر کاربرد ترین ارتباط موجود در میان جدول ها محسوب میشود .

 

 

 

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

 

خلاصه مطلب : ساخت برنامه هایی که از پایگاه داده در سطح گسترده ای استفاده می کنند بدون ایجاد ارتباط بین جدول ها توسط فیلد های کلید امکان پذیر نیست .

هش چیست؟

هش (Hash, Hash Code, Digest, Message Digest هم نامیده می شود) را می توان به صورت اثر انگشت دیجیتالی یک داده در نظر گرفت. با این روش شما می توانید رشته ای اندازه-ثابت (fixed length) از یک داده به دست آورید که با روش های ریاضی به صورت "یک طرفه" رمزنگاری شده است. کشف رشته اصلی از رشته هش آن (عملیات معکوس) به صورت کارا تقریبا  غیر ممکن است. نکته دیگر اینکه هر داده یک رشته هش شده کاملا  منحصر به فرد ایجاد می کند( احتمال یکی شدن رشته های هش دو رشته متفاوت در الگوریتم MD5 یک در 3.4028236692093846346337460743177e+38 می باشد..  این خواص ، هش کردن را به روشی کارا و ایده آل برای ذخیره سازی کلمات عبور در برنامه های شما تبدیل می کند. چرا؟ برای این که حتی اگر یک نفوذگر(Hacker) بتواند به سیستم و بانک اطلاعاتی شما نفوذ کند و بخشی از اطلاعات شما را به دست آورد (شامل کلمات عبور هش شده) نمی تواند کلمات عبور اولیه را از روی آن ها بازیابی کند.

 

 

یکی از دو خصوصیت الگوریتم های   HASHاینه که معکوس پذیر نیستند! دومی اینه که هرگز دو ورودی متفاوت به خروجی یکسان منجر نمی شوند. هر یک از این دو خصوصیت اگر نقض بشه می گیم الگوریتم شکسته!!!

 

 

شناسایی اعضا با استفاده از Hash  

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

 

 

 

 

 

 

 

Hashes are "digests", not "encryption"

Hash یک عمل خلاصه سازی (digest ) را روی جریان  ورودی انجام می دهد نه یک عمل رمز نگاری (encryption) .

Encryption داده را از یک متن صریح (Clear text) به یک متن برمز در آورده تبدیل می کند (Cipher text). encryption  ک عمل دو طرفه می باشد . که هرچه حجمClear text  بیشتر باشد حجم Cipher text نیز بیشتر می شود.

که این ارتباط در شکل زیر به خوبی بیان شده است:

 

 Encryption - a two-way operation

Hashe ها جریان داده ورودی را به یک خلاصه کوچک تبدیل می کنند. که این یک عمل یک طرفه(غیر قابل بازگشت) می باشد. و  جریان داده ورودی آنها با هر حجمی که باشد خروجی یک مقدار ثابت میشود.

شکل بعدی این ارتباط را در خلاصه سازی توسط الگوریتم  MD5  به خوبی نشان می دهد.

 

 

Hashing - a one-way operation

 

 

موارد استفاده از Hash  ها

Hash ها کلا موارد استفاده کمی دارند که ما در ادامه بحث آن ها را بیان می کنیم:

1. تشخیص درستی یک فایل Verifying file integrity

برای مثال زمانی که یک فایل با حجم بالا را دانلود می نماییم می توانیم با به دست آوردن مقدار MD5 آن فایل توسط دستور md5sum  و مقایسه آن  با مقدار Md5  داده شده توسط سایت مورد  نظر  از درستی فایلمان اطمینان حاصل کنیم.

2.hash  کردن کلمه عبور Hashing passwords

قبلا به طور مفصل بحث شد.

 

3. نشانه گذاری  اسناد به روش digitally (امضاهای digitally)

که نحوه انجام ان به وضوح در شکل زیر نشان داده شده است:

 

 

 

 

Collision (تصادم) در Hash

زمانی که مقدار  Hash  دو ورودی متفاوت یکسان باشند می گوییم Collision  رخ داده است.

 

اما تا کنون هیچ موردی از Collision دیده نشده است . این امر از این حقیقت  ناشی می شود که تعداد مقادیر یک الگوریتم  hash بسیار زیاد می باشند.برای مثال یک Hash  128 بیتی میتواند 3.4 x 1038

مقدار ممکن داشته باشد.که معادل 340,282,366,920,938,463,463,374,607,431,768,211,456 میباشد.

 

انواع هش

  • MD4 (128 bits, obsolete)
  • MD5 (128 bits)
  • RIPEMD-160 (160 bits)
  • SHA-1 (160 bits)
  • SHA-256, SHA-384, and SHA-512 (longer versions of SHA-1, with slightly different designs)

 

انواع مختلفی از الگوریتم های قوی هش کردن برای استفاده در برنامه های کاربردی موجود هستند، محبوب ترین آنها که مورد استفاده برنامه نویسان هستند MD5 و SHA-1(Secure hash algorithm)می باشند. سیستم های قدیمی تر از( DES(Data Encryption Standard استفاده می کردند. این روش 56 بیتی دیگر  یک روش قوی هش کردن محسوب نمی گردد. ، الگوریتم های قوی تری مانند SHA-256 و SHA-512  برای موارد خاص مانند امضاهای دیجیتالی توصیه می گردد ولی برای هش کردن کلمات عبوردر برنامه های امروزی SHA-1 هنوز سطح امنیت بسیار خوبی را فراهم می کند.

 

Hash Table

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

 رسیدیم. O(logn) به جستجوی دودویی با O(n) در واقع از جستجوی خطی با

حال می خواهیم یک ساختمان داده جدید به نام جدول هش را معرفی کنیم که کارایی عمل جستجو را تا افزایش می دهد.O(1)

یک جدول هش از دو قسمت تشکیل شده : یک آرایه (جدول واقعی جایی که دادهایی که جستجو می شود  ) که به آن تابع هش می گویند.mapping function در آن ذخیره می شود ) و یک تابع  نگاشت (

اندیس های آرایه که  (integer space ) تابع هش نگاشتی است از فضای ورودی به فضای اعداد صحیح را مشخص می کند . به عبارت دیگر تابع هش روشی را فراهم می کند  برای اختصاص دادن اعداد به داده های ورودی به گونه ای که سپس داده  ورودی می تواند در اندیس آرایه مطابق باعدد تخصیص داده ذخیره شود.در ادامه مثالی در این رابطه  بیان می کنیم:

مثال را آغاز می کنیم. یعنی از رشته ها به عنوان داده هایی ابتدا با یک آرایه جدول هش از رشته ها که ذخیره و جستجو می شوند استفاده می کنیم . اندازه جدول هش را در این مثال 12 می گیریم.

 

The empty hash table of strings

در مرحله بعد ما به یک تابع هش نیاز دارم. راههای زیادی برای ساختن یک تابع هش وجود دارد. در حال حاضر یک تابع هش ساده را در نظر می گیریم. که یک رشته را به عنوان ورودی میگیرد. مقدار هش برگشتی از تابع برابر مجموع  کاراکتر های اسکی است که رشته ورودی را می سازند به پیمانه اندازه جدول:

int hash(char *str, int table_size)
{
               int sum;
 
               /* Make sure a valid string passed in */
               if (str==NULL) return -1;
 
               /* Sum up all the characters in the string */
               for( ; *str; str++) sum += *str;
 
               /* Return the sum mod the table size */
               return sum % table_size;
}

  اجرا می کنیم که مقدار 3 حاصل می شود.("Steve",12) تابع هش را باپارامتر های

.  را در جدول ذخیره می کنیم Steve  حال رشته

The hash table after inserting "Steve"

 

   اجرا میکنیم("Spark",12) تابع هش را با پارامتر های ."Spark"  بیایید رشته دیگری را امتحان کنیم:

که عدد 6 حاصل می شود. سپس آن را نیز در جدول ذخیره میکنیم.

The hash table after inserting "Spark"

  اجرا میکنیم . که این بار نیز مقدار 3 حاصل می شود.("Notes",12)  حال تابع هش را با پارامتر های

را نیز در جدول درج می کنیم. Notesرشته

 

A hash table collision

مشاهده می شود که  دو ورودی متفاوت مقدارهش  یکسانی دارند و هر دو عنصر باید در یک مکان در آرایه درج شوند که این مساله غیر ممکن است . و همانطور که قبلا نیز ذکر شد به این مساله تصادم گفته (linear probing) می شود. در رابطه با تصادم الگوریتم های زیادی وجود دارد از قبیل اکتشاف خطی  و زنجیرسازی جداگانه.

بررسی می کنیم. ر ا  (Separate Chaining) که ما در اینجا زنجیره سازی جداگانه

زنجیره سازی جداگانه به مقدار کمی تغییر در ساختمان دادهمان نیاز دارد. به جای ذخیره سازی مستقیم داده ها در آرایه آنها را در لیست های پیوندی ذخیره می کنیم. هر عنصر آرایه به یکی از این لیست های پیوندی اشاره می کند. زمانی که مقدار هش یک ورودی به دست آمد آن عنصر به لیست پیوندی که در اندیس مورد  نظر در آرایه  وجود دارد اضافه  می شود . از ان جایی که  لیست های پیوندی محدودیت در طولشان ندارند مساله تصادم ها حل شده به حساب می آید. اگر دو داده متفاوت مقدار هش یکسانی داشته باشند هر دوی آنها در لیست پیوندی ذخیره می شوند.

بیایید مثال بالا را این بار با ساختمان داده تغییر یافته مان بررسی نماییم :

Modified table for separate chaining

 

 

دوباره  Steve را با مقدار هش 3 به جدولمان اضافه میکنیم:

After adding "Steve" to the table

هم چنین Spark با مقدار هش 6 را نیز به جدولمان اضافه می کنیم:

After adding "Spark" to the table

حال Notes با مقدار هش 3 (همانند مقدار هش Steve) را اضافه می کنیم:

Collision solved - "Notes" added to table

 

مراحل جستجو مشابه با عمل درج در جئول می باشد. ما مقدار هش داده ای را که می خواهیم جستجو شود  را به دست می آوریم. سپس به ان مکان از آرایه می رویم. لیستی که از آن مکان سرچشمه می گیرد (آغاز میشود) را بررسی می کنیم. و می بینیم که چیزی که به دنبال آن هستیم در لیست وجود دارد یا نه .

=>تعداد مراحل O(1) می باشد.

زنجیره سازی جداگانه Separate chaining)  ) به ما این امکان را می دهد که مساله تصادم را در یک روش ساده و قدرتمند حل نماییم . با این حال هنوز مشکلاتی وجود دارد . حالتی را فرض کنید که تمام داده های ورودی دارای یک مقدار هش باشند. در این مورد برای جستجوی یک داده باید یک جستجوی خطی با O(n) در لیست  پیوندی انجام دهیم .  پس در بدترین حالت این روش O(n) را خواهیم داشت که احتمال آن بسیار کم است . در حال که در بهترین حالت و حالت متوسط O(1) را خواهیم داشت!

آموزش زبان #C اول

در این درس با ارائه چند برنامه و مثال ساده به طرز کار زبان C

# می‌پردازیم. اهداف این درس عبارتند از :

 

لیست 1-1، یک برنامة ساده با عنوان Welcome در زبان C#

// Namespace اعلان

using  System;

 

// کلاس آغازین برنامه

class WelcomeCSS

  {

   // آغاز کار اجرای برنامه

   public static void Main()

    {

     // نوشتن متن در خروجی

     Console.WriteLine("Welcome to the C# Persian Tutorial!");

    }

  }

برنامة لیست 1-1 دارای 4 پارامتر اصلی است، اعلان Namespace، کلاس، متد Main() و یک دستور زبان C#.

در همین جا باید به یک نکته اشاره کنم، برای زبان C# همانند بیشتر زبانهای برنامه‌سازی دو نوع کامپایلر وجود دارد. یک نوع کامپایلر که به کامپایلر Command Line معروف است و نوع دیگر کامپایلر Visual است. کامپایلر‌های Command Line محیطی شبیه به محیط DOS دارند و با دادن یک سری دستورات به اجرا در می‌آیند. کامپایلرهای Visual محیطی همانند ویندوز دارند که با دارا بودن محیط گرافیکی و ابزارهای خاص، برنامه‌نویس را در امر برنامه‌سازی کمک می‌کنند. از نمونه‌های هر یک از کامپایلرها، می‌توان به Microsoft C# Command Line Compiler که یک کامپایلر Command Line و Microsoft Visual C# که یک کامپایلر Visual است، اشاره کرد. البته در حال حاضر بیشتر از کامپایلرهای ویژوال استفاده می‌شود.

من سعی می‌کنم در آینده به توضیح محیط Visual C# و Visual Studio.Net بپردازم. اما فعلاً برای اجرای برنامه‌ها می‌توانید از Visual Studio.Net استفاده کنید. پس از نصب آن، وارد محیط C# شده و در قسمت انتخاب برنامة جدید گزینة Console را جهت اجرای برنامه‌ها انتخاب نمایید.

برای این درس، فعلاً به توضیحات بیشتر دربارة محیط ویژوال نمی‌پردازم اما در آینده به توضیح کامل محیط Visual Studio.Net خواهم پرداخت.

برای اجرای کد بالا در صورتیکه از محیط ویژوال استفاده می‌کنید باید بر روی دکمة Run کلیک کنید و در صورتیکه کامپایلر Command Line دارید با دستور  زیر می‌توانید برنامه را اجرا کنید : csc Welcome.cs

پس از اجرای برنامه، کامپایلر برای شما یک فایل قابل اجرا(Executable) تحت نام Welcome.exe تولید می‌کند.

نکته : در صورتیکه از Visual Studio.Net(VS.Net) استفاده کنید، پس از اجرای برنامه، یک صفحه برای نمایش خروجی به سرعت باز شده و بسته می‌شود و شما قادر به دیدن خروخی نخواهید بود. برای اینکه بتوانید خروجی برنامه را ببینید، در انتهای برنامه دستور زیر را وارد نمایید :

Console.ReadLine();

 استفاده از این دستور باعث می‌شود تا برنامه منتظر دریافت یک ورودی از کاربر بماند، که در این حالت شما می‌توانید خروجی برنامه خود را دیده و سپس با زدن کلید Enter برنامه را خاتمه دهید.

 

نکتة دیگری که در مورد زبان برنامه‌نویسی C# باید مورد توجه قرار دهید اینست که این زبان Case Sensitive است، بدین معنا که به حروف کوچک و بزرگ حساس است یعنی برای مثال ReadLine با readLine متفاوت است به طوریکه اولی جزو دستورات زبان C# و دومی به عنوان یک نام برای متغیر یا یک تابع که از طرف کاربر تعریف شده است در نظر گرفته می‌شود.

 

اعلان Namespace به سیستم اعلان می‌نماید که شما از توابع کتابخانه‌ای  System  جهت اجرای برنامه‌ها خود استفاده می‌نمایید. دستوراتی مانند WriteLine و ReadLine جزو توابع کتابخانه‌ای System می‌باشند. اغلب دستورات و توابع مهم و کلیدی استفاده از کنسول ورودی/خروجی در این کتابخانه می‌باشد. در صورتیکه در ابتدای برنامه از using System استفاده نکنید، یابد در ابتدای هر یک از دستورات برنامه که مربوط این کتابخانه است، از کلمة System استفاده نمایید. بعنوان مثال در صورت عدم استفاده از using System باید از دستور System.Console.WriteLine() به جای Console.WriteLine() استفاده نمایید.

 

تعریف کلاس،Class Welcome CSS، شامل تعریف داده‌ها(متغیرها) و متدها جهت اجرای برنامه است. یک کلاس، جزو معدود عناصر زبان C# است که بوسیلة آن می‌توان به ایجاد یک شی (Object) از قبیل واسط‌ ها (Interfaces) و ساختارها(Structures)، پرداخت. توضیحات بیشتر در این زمینه در درس‌های آینده ذکر می‌شوند. در این برنامه کلاس هیچ داده‌ و متغیری ندارد و تنها شامل یک متد است. این متد، رفتار(Behavior) این کلاس را مشخص می‌کند.

 

متد درون این کلاس بیان می‌کند که این کلاس چه کاری را پس از اجرا شدن انجام خواهد داد. کلمة کلیدی Main() که نام متد این کلاس نیز می‌باشد جزو کلمات رزرو شده زبان C# است که مشخص می‌کند برنامه از کجا باید آغاز به کار نماید. وجود متد Main() در تمامی برنامه‌های اجرایی ضروری است. در صورتیکه یک برنامه حاوی متد Main() نباشد بعنوان توابع سیستمی همانند dll های ویندوز در نظر گرفته می‌شود.

قبل از کلمة Main() کلمه دیگری با عنوان static آورده شده است. این کلمه در اصطلاح Modifier می‌گویند. استفاده از static برای متد Main() بیان می‌دارد که این متد تنها در در همین کلاس قابل اجراست و هیچ نمونه‌ای (Instance) دیگری از روی آن قابل اجرا نمی‌باشد. استفاده از static برای متد Main() الزامی است زیرا در ابتدای آغاز برنامه هیچ نمونه‌ای از هیچ کلاس و شی‌ای موجود نمی‌باشد و تنها متد Main() است که اجرا می‌شود. (در صورتیکه با برخی اصطلاحات این متن از قبیل کلاس، شی، متد و نمونه آشنایی ندارید، این به دلیل آنست که این مفاهیم جزو مفاهیم اولیة برنامه‌نویسی شی‌گرا (OOP) هستند. سعی می‌کنم در درس‌های آینده به توضیح این مفاهیم نیز بپردازم، ولی فعلاً در همین حد کافی می‌باشد.)

 

هر متد باید دارای یک مقدار بازگشتی باشد، یعنی باید مقداری را به سیستم بازگرداند، در این مثال نوع بازگشتی void تعزیف شده است که نشان دهنده آنست که این متد هیچ مقداری را باز نمی‌گرداند یا به عبارت بهتر خروجی ندارد. همچنین هر متد می‌تواند دارای پارامترهایی نیز باشد که لیست پارامترهای آن در داخل پرانتزهای جلوی آن قرار می‌گیرد. برای سادگی کار در این برنامه متد ما دارای هیچ پارامتری نیست ولی در ادامة همین درس به معرفی پارامترها نیز می‌پردازم.

 

متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص می‌نماید. Console کلاسی در System است و WriteLine() متدی در کلاس  Console. در زبان C# از اپراتور "." (نقطه dot) جهت جداسازی زیرروتین‌ها و زیرقسمتها استفاده می‌کنیم. همانطور که ملاحظه می‌کنید چون WriteLine() یک متد درون کلاس Console است به همین جهت از "." جهت جداسازی آن استفاده کرده‌ایم.

 

در زبان ‍C#، برای قرار دادن توضیحات در کد برنامه از // استفاده می‌کنیم. بدین معنا که کامپایلر در هنگام اجرای برنامه توجهی به این توضیحات نمی‌کند و این توضیحات تنها به منظور بالا بردن خوانایی متن و جهت و کمک به فهم بهتر برنامه قرار می‌گیرند. استفاده از // تنها در مواردی کاربرد دارد که توضیحات شما بیش از یک خط نباشد. در صورت تمایل برای استفاده از توضیحات چند خطی باید در ابتدای شروع توضیحات از /* و در انتها آن از */ استفاده نمایید. در این حالت تمامی مطالبی که بین /*  */ قرار می‌گیرند به عنوان توضیحات (Comments) در نظر گرفته می‌شوند.

 

تمامی دستورات (Statements) با ";"، سمی کولون، پایان می‌یابند. کلاس‌ها و متد‌ها با } آغاز شده و با { خاتمه می‌یابند. تمامی دستورات بین { } یک بلوک را می‌سازند.

 

بسیاری از برنامه‌ها از کاربر ورودی دریافت می‌کنند. انواع گوناگونی از این ورودی‌ها می‌توانند به عنوان پارامتری برای متد Main() در نظر گرفته شوند. لیست 2-1 برنامه‌ای را نشان می‌دهد نام کاربر را از ورودی دریافت کرده و آن را بر روی صفحه نمایش می‌دهد. این ورودی به صورت پارامتری برای متد Main() در نظر گرفته شده است.

 

لیست 2-1 : برنامه‌ای که ورودی را از کاربر، بعنوان پارامتر Main()، دریافت می‌کند.

// Namespace اعلان

using System;

// کلاس آغازین برنامه

class NamedWelcome

  {

   // آغاز اجرا برنامه

   public static void Main(string[] args)

     {

      // نمایش بر روی صفحه

      Console.WriteLine("Hello, {0}!", args[0]);

      Console.WriteLine("Welcome to the C# Persian Tutorial!");

     }

  }

توجه داشته باشید که این برنامه، ورودی را به صورت Command-Line دریافت می‌کند و در هنگام اجرای برنامه باید ورودی را در Command-Line وارد نمایید. در صورتیکه ورودی را وارد ننمایید برنامه دچار مشکل شده و متوقف خواهد شد.

 

همان طور که در لیست 2-1 مشاهده می‌نمایید، پارامتر متد Main() با عنوان args مشخص شده است. با استفاده از این نام در داخل متد می‌توان آن استفاده نمود. نوع این پارامتر از نوع آرایه‌ای از نوع رشته (string[]) در نظر گرفته شده است. انواع(types) و آرایه‌ها را در درس‌های بعدی بررسی می‌کنیم. فعلاً بدانید که آرایه رشته‌ای جهت نگهداری چندین کاراکتر مورد استفاده قرار می‌گیرد. [] مشخص کننده آرایه هستند که مانند یک لیست عمل می‌کند.

 

همانطور که ملاحظه می‌کنید در این برنامه دو دستور Console.WriteLine(…) وجود دارد که اولین دستور مقداری با دستور دوم متفاوت است. همانطور که مشاهده می‌کنید داخل دستور Console.WriteLine(…) عبارتی به شکل {0} وجود دارد. این آرگومان، نشان می‌دهد که به جای آن چه مقداری باید نمایش داده شود که در این جا args[0] نشان داده می‌شود. عبارتی که داخل " " قرار دارد عیناً در خروجی نمایش داده می‌شود، به جای آرگومان {0}، مقداری که پس از " قرار دارد، قرار می‌گیرد. حال به آرگومان بعدی یعنی args[0] توجه کنید. مقدار صفر داخل [] نشان می‌دهد که کدام عنصر از آرایه مورد استفاده است. در C# اندیس آرایه از صفر شروع می‌شود به همین جهت برای دسترسی به اولین عنصر آرایه باید از اندیس صفر استفاده کنیم.(همانطور که قبلاً نیز کفتم آرایه‌ها را در درس‌های آینده توضیح خواهم داد، هدف از این درس تنها آشنایی با C# است.!)

 

مجدداً به آرگومان {0} بازگردیم. این آرگومان نشان می دهد که یک مقدار باید در رشته خروجی قرار گیرد، این مقدار همان args[0]  است. اگر شما این برنامه را از طریق Command-Line اجرا نمایید خروجی شبیه به زیر خواهید گرفت :

>Hello!, Meysam!

>Welcome to C# Persian Tutorial!

همان گونه که می‌بینید، پس از اجرای برنامه نام شما که از طریق Command-Line آنرا وارد نموده‌اید در خروجی ظاهر می‌شود. استفاده از آرگومان {n}، که در آن n یک مقدار عددی است، جهت فرمت دادن به متن خروجی است که بر روی صفحه به نمایش در می‌آید. مقدار n از صفر آغاز شده و به ترتیب افزایش می‌باید. به مثال زیر توجه کنید :

Console.WriteLine("Hello! ,{0} ,{1}, {2}",args[0],args[1],args[2]);

این خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجی به ترتیب نمایش می‌دهد. ملاحظه می‌نمایید که چون 3 مقدار را می‌خواهیم نمایش دهیم، سه بار از آرگومان {n} استفاده کرده‌ایم و هر بار یک واحد به مقدار قبلی افزوده‌ایم. در آینده بیشتر با این مفاهیم آشنا می‌شویم.

 

مطلبی که باید در مورد لیست 2-1 به آن توجه شود آنست که این برنامه تنها از طریق  Command-Lineقابل اجراست و در صورتیکه کاربر از این مطلب که برنامه باید دارای ورودی به صورت Command-Line باشد، بی اطلاع باشد و ورودی را در Command-Line وارد نکند، برنامه متوقف شده و اجرا نمی‌شود. پس برای رفع چنین مشکلی باید از روش بهتری جهت دریافت ورودی از کاربر استفاده کرد.

 

لیست 3-1 : یک برنامه که قابلیت محاوره با کاربر را دارد.

// Namespace اعلان

using System;

 

// کلاس آغازین برنامه

class InteractiveWelcome

  {

   //آغاز اجرای برنامه

   public static void Main()

    {

     // متنی بر روی صفحه نمایش داده می‌شود

     Console.Write("What is your name?: ");

     //متنی نمایش داده شده و برنامه منتظر دریافت ورودی می‌ماند

     Console.Write("Hello, {0}! ", Console.ReadLine());

     Console.WriteLine("Welcome to the C# Persian Tutorial!");

    }

  }

همانطوریکه در این برنامه دیده می شود، متد Main() دارای پارامتر نیست. در عوض یک خط به متن برنامه لیست 2-1 اضافه شده است. در اولین خط از این برنامه، متنی با عنوان اینکه نام شما چیست؟ بر روی صفحه ظاهر می‌شود. سپس در خط بعدی پس از نوشتن کلمه Hello, ، برنامه منتظر دریافت ورودی از کاربر می‌شود. بدین معنی که این بار تا زمانیکه کاربر متنی را به عنوان نام خود وارد نکند اجرای برنامه به پیش نخواهد رفت و خط بعدی اجرا نمی‌شود. این برنامه روش ایجاد ارتباط از طریق برنامه با کاربر را نمایش می‌دهد. در این مثال کاربر دقیقاً متوجه می‌شود که چه زمانی باید اطلاعات را وارد نماید و این اطلاعات چه باید باشد در حالیکه در مثال قبل چنین نبود. همانگونه که می‌بینید در این برنامه آرگومان {0} مستقیماً از طریق دستور Console.ReadLine() دریافت می‌شود و بلافاصله در خروجی نمایش داده می‌شود. دستور ReadLine() نیز یکی از متدهای کلاس Console است که بوسیله آن رشته ورودی خوانده می‌شود.

خروجی برنامه فوق به شکل زیر است :

What is your name?:

(سپس برنامه منتظر دریافت متنی از ورودی توسط کاربر می‌ماند)

(پس از اینکه کاربر رشته‌ای را وارد کرد و کلیدEnter را فشار داد، متن زیر نمایش داده می‌شود.)

Hello, Meysam!

(سپس اجرای برنامه به دستور بعدی منتقل می‌شود)

Welcome to the C# Persian Tutorial!

 

خروجی کامل برنامه :

What is your name?:

Hello, Meysam! Welcome to the C# Persian Tutorial!

توجه کنید که ReadLine() به عنوان یک متد، مقداری را به سیستم بازمی‌گرداند. این مقدار در این برنامه به آرگومان {0} برگردانده می‌شود. این خط از برنامه را می‌توان طور دیگری هم نوشت :

string myName=Console.ReadLine();

Console.WriteLine("Hello, {0}!",myName);

 

در این حالت ما یک متغیر از نوع رشته با نام myName تعریف کرده‌ایم که مقدار ورودی در آن ذخیره می‌شود و سپس از این مقدار به عنوان مقداری‌ که {0} می‌پذیرد استفاده کرده‌ایم.

 

در این درس آموختید که ساختار کلی یک برنامه C# چگونه است. هر برنامه C# از یک کلاس اصلی تشکیل می‌شود که این کلاس شامل داده‌ها و متغیرها و متدهایی می‌باشد. متد آغازین برنامه که برنامه با آن شروع به اجرا می‌کند، متد Main() است. با استفاده از توابع کتابخانه‌ای می‌نوان به کلاسها و متدهای C# دسترسی پیدا کرد. از جمله این توابع System بود که یکی از کلاسهای آن Console و چند متد این کلاس،  متدهای WriteLine() و ReadLine() بودند.

در اینجا اولین درس به پایان رسید. از همه دوستانی که این مطلب را می‌خوانند تقاضا دارم نظرات و پیشنهادات خود را برای من mail کنند.

 

 

سیستم پیکربندی ASP.NET 2.0 (بخش سوم )

در این بخش به بررسی سایر تنظمیات پیکربندی خواهیم پرداخت .

پیکربندی ترجمه
ASP.NET ، صفحات وب ، سرویس های وب ، http handlers ، فایل های برنامه ( نظیر Global.asax ) و فایل های منبع  را به صورت پویا ترجمه می نماید . فایل های فوق به صورت پویا و همزمان با اولین درخواست ، ترجمه می گردند .
هر نوع تغییر در فایل ترجمه شده پویا باعث می گردد  که تمامی منابع متاثر از تغییرات شوند و به صورت پویا invalidated و مجددا" ترجمه گردند . مکانیزم فوق پیاده کنندگان را قادر می سازد که به سرعت برنامه های وب را با حداقل overhead اجراء نمایند. چراکه پس از تشخیص تغییرات و ترجمه پویا ، می توان بلافاصله از امکانات برنامه ها استفاده نمود . 
پتانسیل ترجمه پویا در ASP.NET 2.0 نسبت به ASP.NET 1.x افزایش و فایل های دیگری نظیر کلاس فایل ها را نیز تحت پوشش قرار می دهد .
برای پیکربندی تنظیمات ترجمه از بخش <compilation> در فایل های web.config و یا machine.config استفاده می گردد . ASP.NET engine ، در زمان مورد نیاز صفحه را ترجمه و کد تولید شده را در code cache ذخیره می نماید .از cache فوق در زمان اجرای صفحات ASP.NET استفاده می گردد .
کد زیر گرامر بخش <compilatioin>  را نشان می دهد .

<!-- compilation Attributes -->
<compilation
     tempDirectory="directory"
     debug="[true|false]"
     strict="[true|false]"
     explicit="[true|false]"
     batch="[true|false]"
     batchTimeout="timeout in seconds"
     maxBatchSize="max number of pages per batched compilation"
     maxBatchGeneratedFileSize="max combined size in KB"
     numRecompilesBeforeAppRestart="max number of recompilations ?
      defaultLanguage="name of a language as specified in a <compiler/> element below"
      <compilers>
          <compiler language="language"
              extension="ext"
              type=".NET Type"
              warningLevel="number"
              compilerOptions="options"/>
     </compilers>
     <assemblies>
            <add assembly="assembly"/>
     </assemblies>
     <codeSubDirectories>
            <codeSubDirectory directoryName="sub-directory name"/>
     </codeSubDirectories>
     <buildproviders>
            <buildprovider
                extension="file extension"
                type="type reference"/>
     </buildproviders>
</compilation>

توضیحات :

  • batch : نوع ترجمه را مشخص می نماید (مقدار پیش فرض True است ) .

  • maxBatchSize : حداکثر تعداد صفحات و یا کلاس را که می توان در یک batch ترجمه نمود، مشخص می نماید. ( مقدار پیش فرض 1000 )

  • maxBatchGeneratedFileSize : حداکثر اندازه خروجی یک batch assembley ترجمه شده را نشان می دهد ( مقدار پیش فرض 3000  )

  • batchTimeout : زمان ( بر حسب ثانیه ) ترجمه batch را مشخص می نماید . در صورتی که زمان فوق قبل از اتمام ترجمه به پایان رسیده باشد ، یک exception محقق می گردد ( مقدار پیش فرض پانزده ثانیه است) .

  • debug : آیا می بایست اسمبلی های تولید شده را ترجمه ویا دیباگ نمود ؟ (مقدار پیش فرض False  ).

  • defaultLanguage : زبان برنامه نویسی پیش فرض نظیر VB و یا #C برای استفاده در فایل های ترجمه پویا را مشخص می نماید.

  • tempDirectory : دایرکتوری مورد نظر برای استفاده موقت در حین ترجمه را مشخص می نماید . به صورت پیش فرض ، ASP.NET فایل موقت را در مسیر
     [WinNTWindows]Microsoft.NETFramework[version]Temporary ASP.NET ایجاد می نماید .

  • compilers : بخش <compilers> ، می تواند شامل چندین زیر عنصر <compile> باشد که از آنان به منظور ایجاد یک تعریف جدید کمپایل استفاده می گردد .

  • numRecompilesBeforeAppRestart : تعداد دفعات ترجمه ، قبل از راه اندازی برنامه مشخص می نماید .

قابلیت های مرورگر
شناسائی و استفاده از پتانسیل مرورگرها برای برنامه های وب ضروری است . browser capabilities component  بگونه ای طراحی شده است  تا بتواند از مرورگرهای مختلفی نظیر  opera , netscape و IE  حمایت نماید .  با استفاده از <browserCaps> می توان تنظیمات پیکربندی را برای browser capabilities component  مشخص نمود . از عنصر فوق می توان در سطوح متفاوتی ‌نظیر ماشین ، سایت ، برنامه و زیر دایرکتوری ها استفاده نمود .
پس از دریافت یک درخواست از یک مرورگر ، browser capabilities component  قابلیت های مرورگر را از طریق هدر درخواست شناسائی و برای هر نوع مرورگر یک مجموعه از تنطیمات مرتبط با برنامه را ترجمه می نماید . تنظیمات فوق را می توان به صورت ایستا انجام و یا از هدر درخواست ارسالی استفاده نمود  . یک برنامه می تواند در صورت ضرورت تنظیمات فوق را را توسعه و یا تغییر دهد .
در ASP.NET 2.0 تمامی اطلاعات مربوط به قابلیت های مرورگر در  "فایل های تعریف مرورگر"  ارائه می گردند . این نوع فایل ها ، فایل هائی با انشعاب browser.*  و فرمت xml می باشند . یک فایل ممکن است شامل تعریف بیش از یک نوع مرورگر باشد . فایل های فوق در زمان نصب فریمورک در آدرس
[WinNTWindows]Microsoft.NETFrameworkxxxxxCONFIGBrowsers نصب می گردند . ( در ASP.NET 1.x ، اطلاعات مربوط به پتانسیل هر مرورگر در فایل های machine.config و web.config ذخیره می گردد ).

    توصیف ویژگی های هر مرورگر


هر مرورگر به عنوان یک موجودیت و با استفاده از عنصر <browser> تعریف و دارای یک id مختص به خود  است که یک کلاس از مرورگر را به همراه کلاس parent مشخص می نماید . <browsers> ، عنصر ریشه در فایل های تعریف مرورگر است و  از خصلت id به منظور تمایز بین تعاریف هر یک از مرورگر ها ( در صورتی که بیش از یک مورد در یک فایل تعریف شده باشد ) ، استفاده می گردد .  
قبل از اجرای یک برنامه ASP.NET ، فریمورک تمامی تعاریف مرورگر را در یک اسمبلی ترجمه و آنان را در GAC ذخیره می نماید .
در صورت تغییر فایل های تعریف مرورگر در سطح سیستم ، تغییرات به صورت اتوماتیک بر روی هر یک از برنامه های ASP.NET اعمال نخواهد شد . بنابراین ، این مسئولیت پیاده کنندگان و یا ابزارهای نصب است که اطلاعات فوق را بهنگام نمایند . اطلاعات بهنگام شده مرورگر را می توان با استفاده از برنامه aspnet_regbrowsers.exe برای تمامی برنامه های ASP.NET ارسال نمود . پس از اجرای برنامه فوق ، اطلاعات مرورگر مجددا" ترجمه و اسمبلی جدید در GAC  ذخیره می گردد . از اسمبلی فوق تمامی برنامه های ASP.NET استفاده می نمایند .

 خطاهای سفارشی
در صورت بروز اشکال در هر یک از صفحات ASP.NET ، یک صفحه خطاء نمایش داده می شود که در آن کد نوشته شده به همراه مکان ( شماره خط ) بروز خطاء نشان داده می شود . نمایش کد منبع و مکان بروز خطاء در یک صفحه چالش های مختص به خود را دارد :

  • نمایش کد منبع و پیام خطاء  برای کاربران عادی هیچگونه ارزش اطلاعاتی ندارد، پس چرا می بایست آنان را نمایش داد ؟  

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

ASP.NET با ارائه یک زیرساخت مناسب امکان پیشگیری از نمایش اینگونه خطاها را در اختیار پیاده کنندگان برنامه های وب قرار می دهد . بدین منظور از بخش <customeErrors>  در فایل web.config برای تعریف پیام های خطاء سفارشی و سیاست نمایش جزئیات خطاء استفاده می گردد . نحوه استفاده از عنصر فوق به صورت زیر است :

<customErrors defaultRedirect="[url]" mode="[on/off/remote]">
         <error statusCode="[statuscode]" redirect="[url]" />
</customErrors>rs>

توضیحات :

  • defaultRedirect : آدرس صفحه ای را که پس از بروز خطاء مرورگر کاربران به آن هدایت می گردند را مشخص می نماید .  

  • mode : مقدار نسبت داده شده به این خصلت وضعیت نمایش خطاء سفارشی را مشخص می نماید . در صورتی که مقدار این خصلت on باشد ، خطاهای سفارشی نمایش داده می شوند . در صورتی که مقدار mode معادل off باشد ، خطاهای سفارشی نمایش داده نخواهند شد و در صورتی که مقدار این خصلت remote در نظر گرفته شود ، خطاهای سفارشی صرفا" برای کاربران از راه دور نمایش داده می شود .

  • customeErrors : این بخش شامل چندین زیرعنصر <error> است که از  آنان به منظور تعریف خطاهای سفارشی استفاده می گردد . هر زیر عنصر <error>  می تواند شامل یک خصلت statusCode و یک URL باشد . 

 <configuration>
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/DefaultErrorPage.htm">
      
 <error statusCode="500" redirect="/error/ServerError.htm"/>
          <error
statusCode="404" redirect="/error/Filenotfound.aspx"/>
          <error
statusCode="403" redirect="/error/Forbidden.aspx"/>

   </customErrors>
  </system.web>
</configuration>

در بخش چهارم به بررسی سایر تنظیمات پیکربندی خواهیم پرداخت .

سیستم پیکربندی ASP.NET 2.0 (بخش دوم )

در بخش اول با اصول اولیه سیستم پیکربندی ASP.NET 2.0 آشنا شدیم . در این بخش به بررسی برخی از تنظمیات پیکربندی خواهیم پرداخت .

‍‍‍Connection String
در ASP.NET 1.x ، اطلاعات مربوط به connection string در بخش <appSetting> ذخیره می گردید . در ASP.NET 2.0 ، تمامی اطلاعات در ارتباط با connection-string در یک  بخش جدید با نام <connectionStrings> ذخیره می گردد .
ذخیره اطلاعات connection - string در بخش <appSetting>  دارای چالش های مختص به خود است :
  • زمانی که اطلاعات connection string در بخش appSetting  ذخیره می گردد ، برای یک کنترل مرتبط با داده نظیر SqlCacheDependency و یا MembershipProvider  امکان دستیابی به اطلاعات وجود ندارد . 

  • ایمن سازی Connection string با استفاده از الگوریتم های رمزنگاری چالش های خاص خود را دارد .

  • ویژگی فوق صرفا" در ارتباط با برنامه های ASP.NET نبوده و  تمامی برنامه های دات نت نظیر Windows Forms , Web Service و سایر موارد دیگر را نیز شامل می شود .

با توجه به این که اطلاعات connection string مستقل از بخش appSetting ذخیره می گردد ، می توان آنان را با استفاده از مجموعه متد ConnectionString بازیابی نمود .
کد زیر نحوه ذخیره  connection string در فایل Web.config  را نشان می دهد .

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <connectionStrings>
      <add
           name="MyConnectionString1"
           connectionString="Data Source providerName="System.Data.SqlClient" />
   </connectionStrings>
</configuration>

نحوه بازیابی اطلاعات یک connection string در برنامه :

Public Sub Page_Load (sender As Object, e As EventArgs)
...
Dim dbConnection as New _
   SqlConnection(ConfigurationSettings.ConnectionStrings(
"MyConnectionString1"))
...
End Sub

پیکربندی Session State
state management یکی از مسائل مهم در زمان پیاده سازی برنامه های وب است که می بایست با توجه به اهمیت آن به درستی با ابعاد آن آشنا گردید . در گذشته ای نه چندان دور ( ده سال پیش ) ، با این که برای پیاده سازی برنامه های کامپیوتری از معماری client-server  استفاده می گردید ولی عملا"  در معماری فوق ما دارای یک fat client و یک  fat server می باشیم که برای ذخیره state از امکانات موجود در سمت سرویس دهنده و یا سرویس گیرنده استفاده می شود . با توجه به این که در  معماری فوق ، یک ارتباط دائم بین سرویس گیرندگان و سرویس دهنده وجود دارد برای ذخیره و نگهداری state با مشکل خاصی مواجه نمی شویم .
در برنامه های وب گفتگوی بین یک سرویس گیرنده و یک سرویس دهنده از طریق پروتکل HTTP انجام می شود و جملگی به خوبی می دانیم که این پروتکل یک پروتکل stateless است و ارتباط با یک سرویس دهنده از راه دور در زمان مورد نیاز ایجاد و در ادامه و پس از سرویس دهی ، غیرفعال می شود . با این که HTTP 1.1 از یک روش Keep-alive استفاده می نماید ولی سرویس دهنده نمی تواند درخواست های ایجاد شده توسط یک سرویس گیرنده را تشخیص دهد . 
برای ذخیره و نگهداری state  از گزینه های متعددی استفاده می گردد که session یک نمونه در این زمینه است .شی Session متداولترین محلی است که می توان اطلاعات مربوط به وضعیت برنامه  و کاربران را  در آن ذخیره و نگهداری نمود . برای پیاده سازی session از یک Hashtable استفاده می گردد و  داده بر اساس ترکیب زوج  کلید و مقدار ذخیره می شود .
Session در ASP.NET 2.0 یک مفهوم جدید نیست و متاثر از ماهیت پروتکل HTTP  است ( Stateless ) و قبل از ASP.NET و حتی ASP کلاسیک وجود داشته است .

داده Session در چه مکانی ذخیره می گردد ؟
شی Session یک روش موثر برای ذخیره و نگهداری وضعیت یک برنامه و یا کاربران آن را ارائه می نماید. ASP.NET به همراه سه Storage Provider ارائه شده است :

  • In-Process Session State Store : اطلاعات session در Cache ( حافظه ) ذخیره می گردد .

  • Out-of-Process Session State Store : اطلاعات Session در State Server Service ذخیره می گردد ( asp_net_state.exe )

  • Sql Session State Store : اطلاعات session در بانک اطلاعاتی SQL ذخیره می گردد . برای پیکربندی از aspnet_regsql.exe استفاده می گردد .

در  ASP.NET 2.0 ، یک قابلیت جدید با نام custome به مجموعه فوق اضافه شده است . با استفاده از گزینه فوق ، پیاده کنندگان می توانند داده session را در یک مکان دائم ذخیره نمایند . مثلا" ASP.NET 2.0 امکان ذخیره داده session را در  برخی بانک های اطلاعاتی  نظیر Oracle,DB2 و یا Sybase ندارد . در صورتی که بخواهیم داده session را در یکی از  بانک های اطلاعاتی فوق و یا یک فایل XML ذخیره نمائیم ، می توان از یک Provider class سفارشی استفاده نمود .
برای پیکربندی اطلاعات session از عنصر <sessiononState > در فایل web.config  استفاده می گردد :

<configuration>
   <system.web>
     <sessionState mode="Off|InProc|StateServer|SQLServer|Custom" ../>
   </system.web>
...
</configuration>

 
در ادامه به بررسی مختصر هر یک از گزینه های فوق خواهیم پرداخت .

In-Process Session State Store  : متداولترین و در عین حال سریعترین روش پیکربندی session state در ASP.NET 2.0 می باشد ( مقدار mode برابر inproc در نظر گرفته می شود )  .در این روش داده Session  در cache داخلی HttpRuntime ذخیره شده و به صورت live قابل دستیابی است . با توجه به این که داده session در حافطه ذخیره می گردد ، به سرعت می توان به آن دستیابی داشت ( ضرورتی ندارد  داده از یک مکان دیگر به درون حافظه انتقال یابد ).  داده seesion تا زمان اعتبار session در حافظه موجود می باشد و پس از time out فضای اشغال شده آزاد می گردد . 

Out-of-Process Session State Store : داده  session  در یک process که به عنوان یک سرویس ویندوز اجراء می گردد ، نگهداری می شود ( aspnet_state.exe ) .
 State Service به صورت پیش فرض اجراء نمی گردد و برای فعال کردن آن می توان از دستور net start aspnet_sate استفاده نمود . به صورت پیش فرض ، سرویس فوق از پورت 42424 استفاده می نماید . در صورت ضرورت می توان با استفاده از کلید ریجستری زیر آن را تغییر داد .

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersPort

برای استفاده از روش فوق کافی است که مقدار Inproc به StateServer در فایل web.config تغییر داد . همچنین می بایست از خصلت StateConnectionString به منظور مشخص نمودن IP و شماره پورتی که Session State Service بر روی آن اجراء شده است ، استفاده نمود .

<configuration>
  <system.web>
     <sessionState mode="StateServer"
 
         stateConnectionString="tcpip=127.0.0.1:42424"/>
  </system.web>
</configuration>

Sql Session State Store : داده session در یک بانک اطلاعاتی SQL ذخیره می گردد .

<configuration>
  <system.web>
    <sessionState
        mode="SQLServer"
        sqlConnectionString="data source= TestSessionServer;
        user id=TestWebUser;password=Test"
        cookieless="false"
        timeout="20"
     />
 </system.web>
</configuration>.

Custom State Store :معماری Sessin state در ASP.NET 2.0 بگونه ای طراحی شده است که امکان افزودن Provider به آن وجود دارد ( مشتق شده از کلاس SessionStateStoreProviderBase  ) . در صورتی که بخواهیم Provider اختصاصی خود را ایجاد و یا از یک  third-party provider استفاده نمائیم ، می بایست مقدار خصلت mode را Custome در نظر گرفت . در چنین مواردی ، لازم است که custom provider assembly مشتق شده از کلاس SessionStateStoreProviderBase را مشخص نمود .

<configuration>
  <system.web>
    <sessionState
        mode="Custom"
          CustomProvider="CustomStateProvider">
          <providers>
             <add name="CustomStateProvider"
                type="CustomStateProviderAssembly,
                CustomStateProviderNamespace.CustomStateProviderSateProvider"/>
           </providers>
   </sesisonState>
 </system.web>
</configuration>

 مثال : کد زیر یک نمونه از پیکربندی sessionState  در فایل web.config را نشان می دهد :

<sessionState
      mode="StateServer"
      cookieless="false"
      timeout="20"
      stateConnectionString="tcpip=TestSessionStore:42424"
     
stateNetworkTimeout="60"
      sqlConnectionString=""
/>

توضیحات :

  • mode : نوع ذخیره سازی اطلاعات session را مشخص می نماید . در این رابطه از پنج گزینه Off, InProc, StateServer, SQLServer  و Custom استفاده می گردد . که مقدار پیش فرض InProc است .  

  •  cookieless : مشخص می نماید که آیا از HTTP cookieless Session Key management حمایت می گردد .

  • timeout : مدت زمان حیات Session را مشخص می نماید  . مقدار timeoute بر اساس زمان درخواست ارزیابی می گردد . مثلا" در صورتی که مقدار timeout بیست دقیقه باشد و در خواستی در ساعت ده و ده دقیقه دریافت گردد ، timeout در ساعت ده و سی دقیقه به اتمام می رسد .

  • stateConnnectionString :از خصلت  فوق به منظور مشخص نمودن آدرس  TCP/IP و پورت جهت ارتباط یا  Windows Service providing state management استفاده می گردد ( در مواردی که mode=StateServer در نظر گرفته شود ) .

  • stateNetworkTimeout : مقدار timeout ( بر حسب ثانیه ) را  در زمان ذخیره state در یک out-of-process session ( نظیر  StateServer ) ، مشخص می نماید . 

  • sqlConnectionString : از خصلت فوق  جهت ارتباط با بانک اطلاعاتی SQL Server  برای ذخیره و بازیابی داده session استفاده می گردد ( در مواردی که mode=SQLServer در نظر گرفته شود) . 

پیکربندی Session State  با استفاده از Connection string  : کد زیر یک نمونه از پیکربندی Session State با استفاده از connection string را نشان می دهد :

<configuration>
 <connectionStrings>
   <add name = "TestSessionState"
      connectionString = "data source=TestSessionServer;
      user id=TestWebUser;password=test" />
 </connectionStrings>
 <system.web>
   <sessionState
     mode="SQLServer"
     sqlConnectionString="TestSessionState"
     cookieless="false"
     timeout="20"
    />
 </system.web>
</configuration>

در بخش سوم به بررسی سایر تنظیمات پیکربندی خواهیم پرداخت .

سیستم پیکربندی ASP.NET 2.0 (بخش اول)

پیاده کنندگان برنامه های وب که از  فن آوری ASP کلاسیک به منظور پیاده سازی برنامه های وب در گذشته ای نه چندان دور استفاده می کردند ( و شاید هم اینک نیز استفاده می نمایند ) ، به یاد دارند که اطلاعات پیکربندی برنامه های فوق به صورت باینری و در محلی با نام متابیس IIS ، ذخیره می گردد . پیاده کنندگان برنامه های وب برای اعمال تغییرات لازم در متابیس از دو گزینه متداول استفاده می کردند : نوشتن اسکریپت های مورد نیاز و یا استفاده از کنسول مدیریتی برنامه IIS ( سرویس دهنده وب مایکروسافت ) .
برخلاف ASP کلاسیک ، در ASP.NET 1.x حضور متابیس ها کم رنگ گردید و در مقابل ، استفاده از یک سیستم پیکربندی مبتنی بر xml مورد توجه قرار گرفت . علیرغم این که سیستم فوق دارای انعطاف بمراتب بیشتری نسبت به نسخه قبلی است ولی امکانات مدیریتی مناسبی را به منظور ویرایش فایل های پیکربندی در اختیار پیاده کنندگان برنامه های وب قرار نمی دهد . تنها گزینه موجود برای ویرایش یک فایل پیکربندی ، برخورد با فایل پیکربندی به عنوان یک فایل xml و بهنگام سازی آن فایل بر اساس ماهیت فایل های xml است .  مهمترین مشکل رویکرد فوق ، برخورد با تمامی بخش های فایل پیکربندی به عنوان گره های xml است .
در ASP.NET 2.0 ، امکانات و پتانسیل های متعددی به منظور مدیریت پیکربندی برنامه های وب ارائه شده است با این هدف که بتوان با سادگی و سرعت بیشتری پیکربندی یک برنامه وب را انجام داد .خواندن و ویرایش فایل های پیکربندی در یک ماشین محلی و یا از راه دور از جمله مهمترین ویژگی های ارائه شده در ASP.NET 2.0 می باشد .
اطلاعات پیکربندی یک برنامه ASP.NET  در دو فایل مهم Xml ذخیره می گردد . از Xml برای تشریح خصلت ها و رفتار جنبه های مختلف برنامه های ASP.NET استفاده می‌شود . سیستم  پیکربندی ASP.NET از دو فایل پیکربندی استفاده می نماید :
  • machine.config : فایل پیکربندی سرویس دهنده 

  • Web.Config : فایل پیکربندی برنامه

با توجه به ماهیت فایل های پیکربندی ( فایل هائی از نوع  xml ) ، عناصری که مسئولیت تشریح پیکربندی را برعهده دارند نسبت به حروف بزرگ و کوچک حساس می باشند .
در مثال زیر ، یک نمونه فایل  web.config  به همراه بخش مربوط به معرفی <sessionState> یک برنامه وب  نشان داده شده است .

<?xml version="1.0" encoding="UTF-8" ?>
 <configuration>
   <system.web>
       <sessionState
           mode="InProc"
           stateConnectionString="tcpip=127.0.0.1:42424"
           stateNetworkTimeout="10"
           sqlConnectionString="data source=127.0.0.1; user id=sa; password=test"
           cookieless="false"
           timeout="20"
       />
    </system.web>
</configuration>

مزایای استفاده از یک فایل xml برای پیکربندی (در مقابل یک متابیس باینری )

  • امکان خواندن اطلاعات پیکربندی وجود داشته و می توان به سادگی و با استفاده از یک ویرایشگر متن نظیر NotePad آنان را ویرایش نمود  ( گرچه توصیه می گردد که در این رابطه از ویژوال استودیو 2005 و یا ادیتوری  که قادر به تشخیص تگ های xml می باشد ، استفاده گردد). فایل پیکربندی را می توان به سادگی از یک سرویس دهنده به سرویس دهنده دیگر منتقل نمود . ویژگی فوق در یک Web Farm بسیار مفید و موثر می باشد .

  • پس از انجام تغییرات مورد نیاز  در یک فایل پیکربندی ، ASP.NET به صورت اتوماتیک تغییرات ایجاد شده را تشخیص و آنان را در ارتباط با برنامه اعمال خواهد کرد . ASP.NET بدین منظور یک نمونه جدید از برنامه را ایجاد و کاربران را به برنامه جدید هدایت می نماید .

  • پس از اعمال تغییرات در پیکربندی یک برنامه ASP.NET ، ضرورتی ندارد که مدیریت برنامه سرویس دهنده وب را متوقف و مجددا" فعالیت آن را آغاز نماید . 

  • سیستم پیکربندی ASP.NET قابل توسعه است و اطلاعات مرتبط با یک برنامه را می توان به سادگی ذخیره و بازیابی نمود .

  • اطلاعات حساس ذخیره شده در سیستم پیکربندی ASP.NET 2.0 را می توان در صورت تمایل به صورت رمزشده ذخیره نمود ( اقدامی در جهت افزایش امنیت و ایمن سازی برنامه های وب خصوصا" اطلاعات حساس مرتبط با آنان ) .

فایل پیکربندی سرویس دهنده  : machine.config
هر سرویس دهنده ASP.NET دارای یک فایل پیکربندی با نام machine.config است که در زمان نصب فریمورک بر روی سیستم ایجاد می گردد . فایل فوق در مسیر C:WindowsMicrosoft.NETFrameworkv2.0xxxxx نصب و از محتویات آن به عنوان تنظیمات پیش فرض در تمامی برنامه های ASP.NET نصب شده بر روی سرویس دهنده استفاده می گردد . با توجه به نقش مهم این فایل در عملکرد تمامی برنامه های موجود بر روی کامپیوتر ( ویندور ، وب ) لازم است که تغییر در فایل فوق با دقت خاصی انجام شود و نسبت به نوع کار و دامنه متاثر از تغییرات شناخت کافی وجود داشته باشد .
در صورتی که بر روی سیستم چندین نسخه از فریمورک دات نت نصب شده باشد ، هر نسخه دارای فایل پیکربندی machine.config مختص به خود است  . مثلا" در صورتی که بر روی کامپیوتر نسخه های ASP.NET 1.1 ، ASP.NET 1.0 و ASP.NET 2.0  نصب شده باشد ، هر نسخه فریمورک دارای فایل machine.config مختص به خود است . این بدان معنی است که بر روی سرویس دهنده فوق سه فایل پیکربندی machine.config  وجود خواهد داشت .
علاوه بر فایل machine.config ، فریمورک دات نت دو فایل دیگر را به اسامی machine.config.default  و  machine.config.comments نیز نصب می نماید . از فایل اول به عنوان نسخه backup فایل machine.config استفاده می گردد. در صورتی که بخواهیم به تنظیمات اولیه برگردیم ، کافی است تنظیمات موجود در فایل machine.config.default را به فایل machine.config کپی نمود . در فایل دوم ( machine.config.Comments ) ، هر بخش از فایل پیکربندی تشریح  می گردد .
 ASP.NET runtime ، از دو فایل فوق استفاده نمی نماید و صرفا" بدین جهت نصب شده اند تا در صورت ضرورت از آنان به منظور برگشت به حالت اولیه استفاده نمود ( default factory setting ) .

فایل پیکربندی برنامه  : web.config
برخلاف فایل machine.config ، هر برنامه ASP.NET دارای نسخه اختصاصی تنظیمات پیکربندی مختص به خود است که در فایلی با نام web.config ذخیره می گردد . در صورتی که برنامه وب دارای چندین Subfolder باشد ، هر subfolder دارای فایل web.config مختص به خود است  که محتویات آن از تنظیمات موجود در فایل پیکربندی parent به ارث رسیده است و یا تنظیمات مورد نظر را خود تعریف می نماید . 
برای بهنگام سازی سرویس دهندگان در farm ( بر اساس تنظمیات جدید ) ، می توان به سادگی فایل web.config را به دایرکتوری مربوط به برنامه کپی نمود . در چنین مواردی ضرورتی به دستیابی سرویس دهنده محلی و راه اندازی آن وجود نداشته و برنامه ادامه فعالیت خود را به صورت طبیعی و بر اساس تنظیمات جدید انجام خواهد داد .

 نحوه بکارگیری پیکربندی
زمانی که ASP.NET runtime ، تنظمیات پیکربندی را برای یک درخواست وب بکار می گیرد ، فایل machine.config در یک مجموعه ترکیب و اطلاعات فوق در ارتباط با برنامه مورد نظر بکار گرفته می شوند . تنظیمات پیکربندی از برنامه وب parent به ارث برده می شود . فایل machine.config به عنوان parent تمامی برنامه های وب در نظر گرفته می شود .
پیکربندی هر برنامه وب منحصربفرد است گرچه این تنظیمات از parent به ارث رسیده باشند . مثلا" در صورتی که فایل web.config موجود در فهرست ریشه یک وب سایت مقدار session timeout  را معادل ده دقیقه تعریف نماید ، تنظمیات پیش فرض در فایل machine.config که مقدار session timeout را بیست دقیقه تعریف کرده است ، نادیده می گیرد . 

تشخیص تغییر در فایل پیکربندی
ASP.NET به صورت اتوماتیک تغییرات ایجاد شده در فایل های machine.config و web.config را تشخیص می دهد . تشخیص فوق توسط  رویداد file-change که توسط سیستم عامل محقق می گردد ، انجام می شود .
زمانی که یک برنامه ASP.NET فعالیت خود را آغاز می نماید ، تنظیمات پیکربندی خوانده شده و  در ASP.NET Cache ذخیره می شوند .در ادامه یک file dependency در entry مربوط به cache در فایل machine.config و یا web.config قرار می گیرد . پس از تشخیص تغییر در فایل های machine.config و یا web.config ، یک application domain جدید توسط ASP.NET ایجاد تا به درخواست های جدید سرویس دهد . application domain قدیم پس از پاسخگوئی به درخواست های جاری از بین خواهد رفت .

فرمت فایل پیکربندی
شاید تنها تفاوت اصلی فایل های web.config و machine.config ، نام آنان باشد و شکل و ساختار دو فایل فوق مشابه است . فایل های پیکربندی به چندین بخش تقسیم و هر بخش توسط یک xml element سطح بالا مشخص می گردد . عنصر ریشه xml یک فایل پیکربندی ،  <configuration>  نامیده می شود .
در مثال زیر ، یک فایل نمونه web.config نشان داده شده است ( مقادیر بین علائم [] ، در یک فایل پیکربندی واقعی ، با مقادیر واقعی جایگزین می گردند )  .

<?xml version="1.0" encoding="UTF-8"?>
  <configuration>
       <configSections>
            <section name="[sectionSettings]" type="[Class]"/>
            <sectionGroup name="[sectionGroup]">
                  <section name="[sectionSettings]" type="[Class]"/>
             </sectionGroup>
       </configSections>
   </configuration>

عنصر ریشه Xml یک فایل پیکربندی همواره <configuration>  نامیده می شود . هر section handler به همراه تنظمیات مربوطه در یک <SectionGroup> قرار می گیرند . <SectionGroup> یک ساختار سازمانی درون فایل پیکربندی را ارائه  می نماید تا به کمک آن بتوان پیکربندی مورد نیاز را در گروه های منحصربفرد انجام داد  . به عنوان نمونه بخش <system.web> درون فایل پیکربندی ، مکانی را  که اطلاعات آن در ارتباط با  ASP.NET می باشد ، مشخص می نماید.
پس از آشنائی اولیه با اصول سیستم پیکربندی ASP.NET 2.0 در بخش بعدی با برخی از تنظمیات پیکربندی آشنا خواهیم شد .