خطا در اجرای پروژه
خطا در اجرای پروژه
مفاهیم مقدماتی Data Warehouse :
OLTP ( Online Transaction Processing ) : سیستمهایی میباشند که برای اهداف اصلی سازمان استفاده میشوند و این سیستمها کار پردازش و ذخیره کردن دادهها را در OLTP Database انجام میدهند. مانند تمامی سیستمهای ERP,MIS,…
OLTP Database : پایگاه دادهی سیستمهای OLTP میباشد. به طور معمول هر تراکنش کاربر در کمترین زمان ممکن برروی این سیستمها ذخیره میگردد و در طول روز بارها دستورات ( Insert/Update/Delete ) برروی آنها انجام میشود. این پایگاههای داده، همان Main Data ها یا Source System ها میباشند.
ETL ( extract, transform, and load ) : مراحل انتقال داده از OLTP Database به پایگاه دادهی Stage میباشد. ETL سیستمی میباشد که توانایی اتصال به OLTP را دارد و اطلاعات را از OLTP واکشی میکند و به پایگاه دادهی Stage انتقال میدهد. سپس ETL دادهها را مجتمع ( integrates ) کرده و از Stage به DDS ( Dimensional Data Source ) انتقال میدهد .
Retrieves Data : عملیات واکشی دادهها طبق یک سری قوانین و قواعد میباشد .
برای انجام عملیات ETL دو روش وجود دارد
1. Data مجتمع ( Integrate ) و تمیز ( Data cleansing ) شود و در نهایت وارد Data Warehouse گردد.
2. Data وارد Data Warehouse گردد سپس مراحل مجتمع سازی و پاک سازی دادهها بر روی دادهها در خود Data Warehouse انجام گردد.
Consolidates Data : برخی شرکتها دادههای اصلی خودشان را در چندین پایگاه داده دارند. در این حالت برای انجام عملیات ETL باید دادهها تحکیم و مجتمع شوند و سپس در Data Warehouse ذخیره شوند.
به طور کلی موارد زیر در فرایند ETL در نظر گرفته میشود:
1. Data availability : برخی دادهها در یک سیستم وجود دارند ولی در سیستم دیگری وجود ندارند و یا تفاوت در نگهداری دادهها در سیستمهای مختلف داریم. مثلا در یک سیستم آدرس در سه فیلد نگه داری میشود (کشور-شهر-آدرس) اما در سیستمی دیگر در دو فیلد(کشور-آدرس) نگه داری میشود. در این حالت باید ما در ETL راه کار هایی برای مجتمع کردن این موارد در نظر بگیریم.
2. Time ranges : در سیستمهای مختلف امکان دارد بعدهای زمانی مختلف باشد . مثلا در یک سیستم بررسیها در بازهی ساعتی و در سیستم دیگر بررسیها در بازهی روزانه یا ماهانه باشد . بنابر این در تجمیع دادهها باید این مورد مد نظر گرفته شود.
3. Definitions : تعاریف در سیستمهای مختلف میتواند متفاوت باشد. مثلا در یک سیستم، مبلغ کل فاکتور شامل مالیات میباشد ولی در سیستمی دیگر این مبلغ فاقد مالیات میباشد.
4. Conversion : در فرآیند ETL باید باز از قواعد موجود در سیستمهای مختلف آگاهی داشته باشیم. مثلا در یک سیستم ممکن است دما را به صورت سانتیگراد و در دیگری فارنهایت نگه داری کنند.
5. Matching : باید بررسی لازم را انجام دهیم که کدام داده مرتبط با کدام سیستم میباشد. به عبارت دیگر کدام سیستم مالک داده میباشد و دقیقا دادهها در کدام سیستم معتبرتر میباشند. مثلا پرسنل، هم در سیستم حسابداری میباشند هم در سیستم پرسنلی؛ ولی معمولا دادههای اصلی از سیستم پرسنلی میآیند.
Periodically : عملیات واکشی دادهها ( Retrieves Data ) و مجتمع سازی دادهها ( Consolidates Data ) در فرآیند ETL فقط یکبار اتفاق نمیافتد و این مراحل در بازههای زمانی خاص تکرار میگردند. این واکشی و انتقال دادهها میتواند در روز چند بار تکرار شود یا میتواند چند روز یک بار اجرا گردد و این بستگی دارد به سیاست موجود در Data Warehouse .
DDS (Dimensional Data Source) (Data Warehouse) : یک پایگاه داده از نوع نرمال شده ( Normalized ) یا بعدی ( Dimensional ) میباشد. که دادههای مجتمع شده و تمیز شده سیستمهای OLTP را در خود جای داده است. این پایگاه داده برای واکشیهای سیستمهای آنالیز داده مورد استفاده قرار میگیرد. ورود اطلاعات در Data Warehouse به صورت Batch میباشد و به هیچ عنوان مانند پایگاه دادههای OLTP ویرایش دادهها به صورت Online و هر زمان که دادهها تغییر میکنند، صورت نمیگیرد. اطلاعات در Data Warehouse معمولا به صورت تجمیع شده روزانه، ماهانه، فصلی یا سالانه میباشد. DDS ها مجموعه ای از Dimensional Data Mart ها هستند. و عمدتا به صورت denormalized میباشند.
Dimensional Data Mart : مجموعه ای از جداول Fact , Dimension میباشند که در یک بیزینس خاص باهم در ارتباط و مشترک میباشند.
dimensional data store schemas : طراحیهای مختلفی از جداول Fact , Dimension در DDS وجود دارد که عبارتند از
1. Star schema : سادهترین روش پیاده سازی Data Warehouse
2. Snowflake : در این روش جداول Dimension کمی نرمال سازی بیشتری دارند. سیستمهای آنالیز داده با این روش بهتر کار میکنند.
3. Galaxy schemas : طراحی در این روش بسیار سخت و پیچیده میباشد. با این وجود فرایند ETL در این طراحی سادهتر انجام میشود.
نمونهی طراحی Star به صورت زیر میباشد :
تفاوتهای DDS و NDS :
1. در DDS ها هیچ گونه نرمال سازی خاصی انجام نمیدهیم و عملا تمامی جداول را دینرمال کرده ایم، در حالی که در NDS تمامی جداول تا سطح سوم و گاهی تا سطح پنجم نرمال شده اند.
2. سرعت واکشی و پردازش کوئریها روی DDS خیلی بیشتر از NDS ها میباشد.
3. در صورتی که نیاز باشد Data Warehouse های خیلی بزرگ طراحی کنیم با حجم بسیار زیاد توصیه میشود از NDS ها استفاده شود در حالی که برای Data Warehouse های کوچک و متوسط بهتر است از DDS ها استفاده شود.
تصویر طراحی یک (Enterprise Data Source = NDS) EDS در زیر آمده است :
History : جداول Data Warehouse میتوانند در طول زمان بسیار بزرگ شوند و دارای تعداد رکورد زیادی گردند. اینکه حداکثر دادههای چند سال را در Data Warehouse نگه داری کنیم بستگی به سیاستهای سازمانی دارد که سیستم OLAP برای آن تهیه میگردد. استفاده کردن از table partitioning میتواند در جبران افزایش تعداد رکورد کمک زیادی به ما بکند.
slowly changing dimension (SCD) : سه روش برای نگه داری سابقهی تغییرات در جداول Dimension وجود دارد.
1. SCD type 1 : هیچ گونه سابقهی تغییراتی را نگه داری نمیکنیم
2. SCD type 2 : سابقهی تغییرات در ردیفها نگه داری میشود. در این روش هر ردیف، شماره ردیف قبلی را دارد و تعداد نا محدودی از تغییرات را نگه داری میکنیم.
3. SCD type 3 : سابقهی تغییرات در ستونها نگه داری میشوند و فقط ردیف جاری و آخرین تغییرات را نگه داری میکنیم.
Query : فقط ETL حق تغییرات در Data Warehouse را دارد و کاربر نمیتواند Data Warehouse را تغییر دهد. البته کاربران حق Query کردن از Data Warehouse را دارند.
دقت داشته باشید که کوئریهای پیچیده در NDS ها بسیار کندتر از همان کوئری در DDS میباشد.
Business Intelligence : مجموعه ای از فعالیتها که در یک سازمان برای شناخت بهتر وضعیت Business آن سازمان انجام میشود. نتایج BI کمک بسیاری برای تصمیم گیریهای تکنیکی و استراتژیکی درون سازمان میکند. همچنین کمک به بهبود فرایندهای Business جاری میکند.
فعالیتهای Business Intelligence در سه دسته بندی قرار میگیرند :
1. Reporting : گزارشاتی که از Data Warehouse گرفته میشود و به کاربر نمایش داده میشود و عمدتا این گزارشات به صورت tabular form میباشند.
2. OLAP : فعالیتهای انجام شده روی MDB برای گرفتن گزارشات Drill-Down و ... میباشد.
3. Data mining : فرآیند واکشی و داده کاوی دادههای درون سیستم میباشد، که منجر به کشف الگوها و رفتارها و ارتباطات دادهها در سیستم میشود. توسط داده کاوی ما متوجه میشویم چرا برخی دادهها در سیستم تولید شده اند.
a. descriptive analytics : زمانی که از داده کاوی برای شرح وقایع گذشته و حال استفاده میشود.
b. predictive analytics : زمانی که از داده کاوی برای پیش بینی وقایع گذشته استفاده میشود.
Real time data warehouse : به DW هایی گفته میشود که در کمترین زمان، تغییرات OLTP را در خود خواهند داشت. امروزه این نوع DW ها تغییرات 5 دقیقه تا حداکثر 1 ساعت قبل را در خود دارند. برای دسترسی به چنین DW هایی دو راه زیر وجود دارد :
1. بر روی هر جدول، Trigger هایی باشد تا تغییرات را به DW انتقال دهد. (البته برای این منظور باید Business مربوط به ETL را در این تریگرها نوشت)
2. سورس برنامههای اصلی کاربر ( OLTP ) تغییر کند تا علاوه بر OLTP Database ها Data Warehouse را هم تغییر دهند.
روشهای فوق بسیار روی سرعت و کارایی برنامههای اصلی تاثیر خواهند گذاشت.
NDS ( Normalize Data Source ) : در صورتی که طراحی Data Warehouse به صورت Dimensional نباشد و به صورت Normalize باشد، نوع Data Warehouse از نوع NDS میباشد.
روش ساخت MDB :
OLTP Database -> ETL -> Stage Database -> DDS (Dimensional Data Source = Data Warehouse) -> SSAS -> MDB
روش سادهتر ساخت Data Warehouse :
منظور از Source System همان OLTP Database ها میباشد.
به خاطر داشته باشید که Source System ها جزئی از Data Warehouse نمیباشند.
از کاربردهای Data Warehouse میتوان به موارد زیر اشاره کرد
1. Data Mining
2. استفاده در گزارشات
3. تجمیع داده ها
Data Mining کمک به درک بهتر Business جاری در سازمان میکند. همچنین منجر به کشف دانش از درون دادهها میشود.
برای Data Mining میتوانید از انواع پایگاه دادههای موجود مانند رابطه ای ، سلسله مراتبی و چند بعدی استفاده کرد . حتا میتوان از فایلهای XML , Excel نیز استفاده کرد.
Customer Relationship Management (CRM) :
منظور از مشتری، مصرف کنندهی سرویسی است که سازمان شما ارایه میکند. یک سیستم CRM شامل تمامی برنامه ایی میباشد که تمام فعالیتهای مشتری را پشتیبانی میکند.
Operational Data Store (ODS) :
این پایگاه داده به صورت رابطه ای و نرمال شده میباشد و شامل تمامی اطلاعات پایگاه داده ای OLTP میباشد که در این پایگاه داده مجتمع شده اند. تفاوت ODS با Data Warehouse در این میباشد که دادهها در ODS با هر Transaction به روز میشوند (سرعت بروز رسانی اطلاعات در ODS بالاتر از DW میباشد).
Master Data Management (MDM) :
در یک نگاه میتوان دادهها را به دو دسته تقسیم کرد
1. transaction data
2. master data
transaction data : شامل داده ای transactional در سیستمهای OLTP میباشد.
master data : توضیح دهندهی Business جاری در سازمان میباشد.
برای تشخیص این دو نیاز است Business سازمان را به خوبی شناسایی نمایید. به عبارت دیگر رویدادهای Business ی همان transaction data میباشند و master data شامل پاسخهای این سوالها میباشد. چه کسی، چه چیزی و کجا در مورد Business transaction .
Customer data integration (CDI) : عبارت است از MDM در رابطه با مشتری داده ها. کار این قسمت عبارت است از واکشی، پاک سازی ، ذخیره سازی ، نگه داری و به اشتراک گذاشتن داده ای مشتری میباشد.
Unstructured Data : داده ای ذخیره شده در پایگاه داده ، structured Data میباشند و داده هایی مانند عکس و فیلم و صوت و ...
Service-Oriented Architecture (SOA) : یک متد ساخت برنامه میباشد که در این روش تمامی اجزا برنامه به صورت ماژول هایی دیده میشود که در آنها ارتباطات با دیگر سیستمها به صورت سرویس میباشد و این زیر سیستمها را میتوان در پروژههای مختلف به کار برد.
Real-Time Data Warehouse : DW هایی که توسط ETL به روز میشوند در هنگامی که یک Transaction روی OLTP اتفاق میافتد.
مراحل انتقال داده از OLTP Database به MDB به صورت زیر میباشد.
Data quality : مکانیسم اطمینان بخشی از این که در DW دادهای مناسب و درست وارد میشوند. به عبارت دیگر DQ همان firewall برای DW در مقابل دادههای نامناسب میباشد.
برای بهتر مشخص شدن مکان DQ شکل زیر را در نظر بگیرید
نحوهی حرکت داده ای از OLTP به MDB اولین چیزی میباشد که شما باید به آن فکر کنید و برای آن روشی را انتخاب نمایید قبل از ساخت Data Warehouse .
چهار روش برای معماری انتقال اطلاعات از OLTP به DW وجود دارد (البته به عنوان نمونه و شما میتوانید از روشهای دیگر و طراحیهای مختلف و ترکیبی نیز بهره ببرید)
1. single DDS : در این روش فقط Stage , DDS وجود دارد.
2. NDS + DDS : در این روش علاوه بر Stage,DDS از NDS نیز استفاده میشود.
3. ODS + DDS : در این روش از Stage,ODS,DDS استفاده میگردد.
4. federated data warehouse (FDW ) : استفاده از چندین DW که با هم تجمیع شده اند.
تصویر Single DDS :
تصویر NDS + DDS :
تصویر ODS + DDS :
تصویر federated data warehouse (FDW ) :
منبع : Building a Data Warehouse With Examples in SQL Server انتشارات Apress
ایجاد یک Fork جدید در GitHub
برای ارسال تغییرات انجام شده بر روی یک پروژه، نیاز است به صاحب یا مسئول آن مخزن در GitHub مراجعه و سپس درخواست دسترسی اعمال تغییرات را نمود. در این حالت، احتمال اینکه جواب منفی دریافت کنید، بسیار زیاد است. جهت مدیریت یک چنین مواردی، قابلیتی به نام ایجاد یک Fork پیش بینی شدهاست.
در بالای هر مخزن کد در GitHub، یک دکمه به نام Fork موجود است. بر روی آن که کلیک کنید، یک کپی از آن پروژه را به مجموعهی مخزنهای کد شما در GitHub اضافه میکند. بدیهی است در این حالت، مجوز ارسال تغییرات خود را به GitHub و در اکانت خود خواهید داشت. نحوهی اطلاع رسانی این تغییرات به صاحب اصلی این مخزن کد، ارسال همان PR یا Pull Request است.
دریافت مخزن کد Fork شده از GitHub به کمک Visual Studio
پس از اینکه Fork جدیدی را از پروژهای موجود ایجاد کردیم، نیاز است یک Clone یا کپی مطابق اصل آنرا جهت اعمال تغییرات محلی، تهیه کنیم. برای اینکار VS.NET را گشوده و به برگهی Team Explorer آن که در کنار Solution Explorer قرار دارد، مراجعه کنید.
در اینجا بر روی دکمهی Connect در نوار ابزار آن، کلیک کرده و در صفحهی باز شده، بر روی لینک Clone کلیک نمائید. در اینجا میتوان آدرس مخزن کد Fork شده را جهت تهیه یک Clone مشخص کرد؛ به همراه محلی که قرار است این Clone در آن ذخیره شود.
آدرس HTTPS وارد شده، در کنار تمام مخازن کد GitHub قابل مشاهده هستند:
پس از تکمیل این دو آدرس، بر روی دکمهی Clone کلیک نمائید. پس از پایان کار، اگر به آدرس محلی داده شده بر روی کامپیوتر خود مراجعه کنید، یک کپی از فایلهای این مخزن، قابل مشاهده هستند.
اعمال تغییرات محلی و ارسال آن به سرور GitHub
در ادامه، این پروژهی جدید را در VS.NET باز کرده و تغییرات خود را اعمال کنید. اکنون نوبت به ارسال این تغییرات به سرور GitHub است. برای این منظور به برگهی Team Explorer مراجعه کرده و بر روی دکمهی Home آن کلیک کنید. سپس گزینهی Changes را انتخاب نمائید:
در اینجا توضیحاتی را نوشته و سپس بر روی دکمهی Commit کلیک کنید.
پس از هماهنگ سازی محلی، اکنون نوبت به هماهنگ سازی این تغییرات با مخزن کد GitHub است. بنابراین بر روی لینک Sync در پیام ظاهر شده کلیک کنید و در صفحهی بعدی نیز بر روی دکمهی Sync کلیک نمائید:
اکنون اگر به پروژهی GitHub خود مراجعه کنید، این تغییر جدید قابل مشاهدهاست:
مطلع سازی صاحب اصلی مخزن کد از تغییرات انجام شده
تا اینجا کسی از تغییرات جدید انجام شدهی توسط ما باخبر نیست. برای اطلاع رسانی در مورد این تغییرات، به مخزن کد Fork شده که اکنون تغییرات جدید به آن ارسال شدهاند، مراجعه کنید. سپس در کنار صفحه بر روی لینک Pull request کلیک نمائید:
در اینجا بر روی دکمهی New pull request کلیک کنید:
در ادامه تغییرات ارسال شما نمایش داده خواهند شد. آنها را بررسی کرده و مجددا بر روی دکمهی Create pull request کلیک کنید:
در اینجا عنوان و توضیحاتی را وارد کرده و سپس بر روی دکمهی Create pull request کلیک نمائید:
یکی سازی تغییرات با مخزن اصلی
اکنون صاحب اصلی مخزن کد یک ایمیل را دریافت خواهد کرد؛ همچنین اگر به مخزن کد خود مراجعه نماید، آمار Pull requests دریافتی قابل مشاهده است:
پس از انتخاب یکی از آنها، لینکی برای بررسی تغییرات انجام شده و همچنین دکمهای برای یکی سازی آنها با پروژهی اصلی وجود دارد:
دریافت این تغییرات در مخزن کد محلی توسط صاحب اصلی پروژه
اکنون که این تغییرات با پروژهی اصلی Merge و یکی شدهاند، صاحب اصلی پروژه جهت تهیهی یک کپی محلی و بهبود یا تغییر آنها میتواند به صورت ذیل عمل کند:
ابتدا به برگهی Team explorer مراجعه کرده و بر روی دکمهی Home آن کلیک کنید. سپس گزینهی Unsynced commits را انتخاب نمائید. در صفحهی باز شده بر روی دکمهی Sync کلیک نمائید. به این ترتیب آخرین تغییرات را از مخزن کد GitHub به صورت خودکار دریافت خواهید کرد:
LocalDb دیتابیس توصیه شده برای ویژوال استودیو است و برای انواع پروژهها مانند اپلیکیشنهای وب میتواند استفاده شود. هنگام استفاده از این دیتابیس در IIS Express یا Cassini همه چیز طبق انتظار کار میکند. اما به محض آنکه بخواهید از آن در Full IIS استفاده کنید با خطاهایی مواجه میشوید. مقصود از Full IIS همان نسخه ای است که بهمراه ویندوز عرضه میشود و در قالب یک Windows Service اجرا میگردد.
هنگام استفاده از Full IIS دو خاصیت از LocalDb باعث بروز مشکل میشوند:
- LocalDb نیاز دارد پروفایل کاربر بارگذاری شده باشد
- بصورت پیش فرض، وهله LocalDb متعلق به یک کاربر بوده و خصوصی است
در ادامه این مقاله روی بارگذاری پروفایل کاربر تمرکز میکنیم، و در قسمت بعدی به مالکیت وهله LocalDb میپردازیم.
بارگذاری پروفایل کاربر
بگذارید دوباره به خطای موجود نگاهی بیاندازیم:
System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 0 - [x89C50120])
این پیغام خطا زیاد مفید نیست، اما LocalDb اطلاعات بیشتری در Event Log ویندوز ذخیره میکند. اگر Windows Logs را باز کنید و به قسمت Application بروید پیغام زیر را مشاهده خواهید کرد.Reported at line: 400
بعلاوه این پیام خطا:
Cannot get a local application data path. Most probably a user profile is not loaded. If LocalDB is executed under IIS, make sure that profile loading is enabled for the current user.
به احتمال زیاد تعداد بیشتری از این دو خطا در تاریخچه وقایع وجود خواهد داشت، چرا که منطق کانکشن ADO.NET چند بار سعی میکند در بازههای مختلف به دیتابیس وصل شود.
پیغام خطای دوم واضح است، نیاز است پروفایل کاربر را بارگذاری کنیم. انجام اینکار زیاد مشکل نیست، هر Application Pool در IIS تنظیماتی برای بارگذاری پروفایل کاربر دارد که از قسمت Advanced Settings قابل دسترسی است. متاسفانه پس از انتشار سرویس پک 1 برای Windows 7 مسائل کمی پیچیدهتر شد. در حال حاظر فعال کردن loadUserProfile برای بارگذاری کامل پروفایل کاربر به تنهایی کافی نیست، و باید setProfileEnvironment را هم فعال کنیم. برای اطلاعات بیشتر در این باره به مستندات KB 2547655 مراجعه کنید. بدین منظور باید فایل applicationHost.config را ویرایش کنید. فایل مذکور در مسیر C:\Windows\System32\inetsrv\config قرار دارد. همانطور که در مستندات KB 2547655 توضیح داده شده، باید پرچم هر دو تنظیمات را برای ASP.NET 4.0 فعال کنیم:
<add name="ASP.NET v4.0" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated"> <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" /> </add>
جای هیچ نگرانی نیست، چرا که این پیغام خطا انتظار میرود. همانطور که در ابتدا گفته شد، دو خاصیت LocalDb باعث بروز این خطاها میشوند و ما هنوز به خاصیت دوم نپرداخته ایم. بصورت پیش فرض وهلههای LocalDb خصوصی (private) هستند و در Windows account جاری اجرا میشوند. بنابراین ApplicationPoolIdentity در IIS به وهلههای دیتابیس دسترسی نخواهد داشت. در قسمت دوم این مقاله، راههای مختلفی را برای رفع این مشکل بررسی میکنیم.
زمانیکه پروسهی کامپایل برنامه شروع میشود، در این بین، به مرحلهی جدیدی به نام «تولید کدها» میرسد. در این حالت، کامپایلر تمام اطلاعاتی را که در مورد پروژهی جاری در اختیار دارد، به تولید کنندهی کد معرفی شدهی به آن ارائه میدهد. بر اساس این اطلاعات غنی ارائه شدهی توسط کامپایلر، تولید کنندهی کد، شروع به تولید کدهای جدیدی کرده و آنها را در اختیار ادامهی پروسهی کامپایل، قرار میدهد. پس از آن، کامپایلر با این کدهای جدید، همانند سایر کدهای موجود در پروژه رفتار کرده و عملکرد عادی خودش را ادامه میدهد.
یک برنامه میتواند از چندین Source Generators نیز استفاده کند که روش قرار گرفتن آنها را در پروسهی کامپایل، در شکل زیر مشاهده میکنید:
Source Generators از یکدیگر کاملا مستقل هستند و اطلاعات آنها Immutable است. یعنی نمیتوان اطلاعات تولیدی توسط یک Source Generator را در دیگری تغییر داد و تمام فایلهای تولیدی توسط انواع Source Generators موجود، به پروسهی کامپایل نهایی اضافه میشوند. هرچند زمانیکه فایلی توسط یک تولید کنندهی کد، به کامپایلر اضافه میشود، بلافاصله اطلاعات آن در کل برنامه و IDE و تمام Source Generators موجود دیگر، قابل مشاهده و استفاده است.
مقایسهای بین تولید کنندههای کد و فناوری IL Weaving
Source Generators، تنها راه و روش تولید کد، نیستند و پیش از آن روشهایی مانند استفاده از T4 templates ، Fody ، PostSharp و امثال آن نیز ارائه شدهاست. در ادامه مقایسهای را بین تولید کنندههای کد و فناوری IL Weaving را که پیشتر در سری AOP در این سایت مطالعه کردهاید، مشاهده میکنید:
تولید کنندههای کد:
- تنها میتوانند فایلهای جدید را اضافه کنند. یعنی «در حین» پروسهی کامپایل ظاهر میشوند و به عنوان یک مکمل، تاثیر گذارند. برای مثال نمیتوانند محتوای یک خاصیت یا متد از پیش موجود را تغییر دهند. اما میتوانند هر نوع کد partial ای را «تکمیل» کنند.
- محتوای اضافه شدهی توسط یک تولید کنندهی کد، بلافاصله توسط Compiler شناسایی شده و بررسی میشود و همچنین در Intellisense ظاهر شده و به سادگی قابل دسترسی است. همچنین، قابلیت دیباگ نیز دارد.
IL Weaving:
- میتوانند bytecode برنامه را تغییر دهند. یعنی «پس از» پروسهی کامپایل ظاهر شده و کدهایی را به اسمبلی نهایی تولید شده اضافه میکنند. در این حالت محدودیتی از لحاظ محل تغییر کدها وجود ندارد. برای مثال میتوان بدنهی یک متد یا خاصیت را بطور کامل بازنویسی کرد و کارکردهایی مانند تزریق کدهای caching و logging را دارند.
- کدهایی که توسط این پروسه اضافه میشوند، در حین کدنویسی متداول، قابلیت دسترسی ندارند؛ چون پس از پروسهی کامپایل، به فایل باینری نهایی تولیدی، اضافه میشوند. بنابراین قابلیت دیباگ به همراه سایر کدهای برنامه را نیز ندارند. به علاوه چون توسط کامپایلر در حین پروسهی کامپایل، بررسی نمیشوند، ممکن است به همراه قطعه کدهای غیرقابل اجرایی نیز باشند و دیباگ آنها بسیار مشکل است.
آیندهی Reflection به چه صورتی خواهد شد؟
هرچند Reflection کار تولید کدی را انجام نمیدهد، اما یکی از کارهای متداول با آن، یافتن و محاسبهی اطلاعات خواص و فیلدهای اشیاء، در زمان اجرا است و مزیت کار کردن با آن نیز این است که اگر خاصیتی یا فیلدی تغییر کند، نیازی به بازنویسی قسمتهای پیاده سازی شدهی با Reflection نیست. به همین جهت برای مثال تقریبا تمام کتابخانههای Serialization، از Reflection برای پیاده سازی اعمال خود استفاده میکنند.
امروز، تمام اینگونه عملیات را توسط Source Generators نیز میتوان انجام داد و این فناوری جدید، قابلیت به روز رسانی خودکار کدهای تولیدی را با کم و زیاد شدن خواص و فیلدهای کلاسها دارد و نمونهای از آن، Source Generator توکار مرتبط با کار با JSON در دات نت 6 است که به شدت سبب بهبود کارآیی برنامه، در مقایسه با استفادهی از Reflection میشود؛ چون اینبار تمام محاسبات دقیق مرتبط با Serialization به صورت خودکار در زمان کامپایل برنامه انجام میشود و جزئی از خروجی برنامهی نهایی خواهد شد و دیگر نیازی به محاسبهی هربارهی اطلاعات مورد نیاز، در زمان اجرای برنامه نیست.
نمونهای از روش دسترسی به اطلاعات کلاسها و خواص و فیلدهای آنها را در زمان کامپایل برنامه توسط Source Generators، در مثال قسمت بعد، مشاهده خواهید کرد.
وضعیت T4 templates چگونه خواهد شد؟
در سالهای آغازین ارائهی دات نت، استفاده از T4 templates جهت تولید کدها بسیار مرسوم بود؛ اما با ارائهی Source Generators، این ابزار نیز منسوخ شده در نظر گرفته میشود.
T4 Templates همانند Source Generators تنها کدها و فایلهای جدیدی را تولید میکنند و توانایی تغییر کدهای موجود را ندارند. اما مشکل مهم آن، داشتن Syntax ای خاص است که توسط اکثر IDEها پشتیبانی نمیشود. همچنین عموما اجرای آنها نیز دستی است و برخلاف Source Generators، با تغییرات کدها، به صورت خودکار به روز نمیشوند.
تغییرات زبان #C در جهت پشتیبانی از تولید کنندههای کد
از سالهای اول ارائهی زبان #C، واژهی کلیدی partial، جهت فراهم آوردن امکان تقسیم کدهای یک کلاس، به چندین فایل، میسر شد که از این قابلیت در فناوری T4 Templates زیاد استفاده میشد. اکنون با ارائهی تولید کنندههای کد، واژهی کلیدی partial را میتوان به متدها نیز افزود تا پیاده سازی اصلی آنها، در فایلی دیگر، توسط تولید کنندههای کد انجام شود. تا C# 8.0 امکان افزودن واژهی کلیدی partial به متدهای خصوصی یک کلاس و آن هم از نوع void وجود داشت و در C# 9.0 به متدهای عمومی کلاسها نیز اضافه شدهاست و اکنون این متدها میتوانند void هم نباشند:
partial class MyType { partial void OnModelCreating(string input); // C# 8.0 public partial bool IsPet(string input); // C# 9.0 } partial class MyType { public partial bool IsPet(string input) => input is "dog" or "cat" or "fish"; }
پروژههای کوچک عموما دارای ساختاری مشابه تصویر ذیل میباشند:
این مورد، روش پیشنهادی در Angular Seed است و بدین صورت است که تعاریف ماژولها در فایل app.js انجام میگیرد. تعاریف و پیاده سازی تمام کنترلرها در فایل controller.js است. و همچنین دایرکتیوها و فیلترها و سرویسها هر کدام در فایلها جداگانه تعریف و پیاده سازی میشوند. این روش راه حلی سریع برای پروژههای کوچک با تعداد developerهای کم است. برای مثال زمانی که یک developer در حال ویرایش فایل controller.js است، از آن جا که فایل مورد نظر checkout خواهد شد در نتیجه سایر developerها امکان تغییر در فایل مورد نظر را نخواهند داشت. سورس فایلها به مرور زیاد خواهد شد و در نتیجه debug آن سخت میشود.
روش دوم
در این حالت تعاریف کنترلر ها، مدلها و سرویسها هرکدام در یک دایرکتوری مجزا قرار خواهد گرفت. برای هر view یک کنترلر و بنا بر نیاز مدل تعریف میکنیم. ساختار آن به صورت زیر میشود:
دایرکتیوها و فیلترها عموما در یک فایل قرار داده خواهند شد تا بنابر نیاز در جای مناسب رفرنس داده شوند. این روش ساختار مناسبتری نسبه به روش قبلی دارد اما دارای معایبی هم چون موارد زیر است:
»وابستگی بین فایلها مشخص نیست در نتیجه بدون استفاده از کتابخانه هایی نظیر requireJs با مشکل مواجه خواهید شد.
»refactoring کدها تا حدودی سخت است.
روش سوم
این ساختار مناسب برای پیاده سازی پروژهها به صورت ماژولار است و برای پروژههای بزرگ نیز بسیار مناسب است. در این حالت شما فایلهای مربوط به هر ماژول را در دایرکتوری خاص آن قرار خواهید داد. به صورت زیر:
همان طور که ملاحظه میکنید سرویس ها، کنترلرها و حتی مدلهای مربوط به هر بخش در یک مسیر جداگانه قرار میگیرند. علاوه بر آن فایل هایی که قابلیت اشتراکی دارند در مسیری به نام common وجود دارند تا بتوان در جای مناسب برای استفاده از آنها رفرنس داده شود. حتی اگر در پروژه خود فقط یک ماژول دارید باز سعی کنید از این روش برای مدیریت فایلهای خود استفاده نمایید. اگر با ngStart آشنایی داشته باشید به احتمال زیاد با این روش بیگانه نیستید.
بررسی چند نکته درباره کدهای مشترک
»اگر ماژولها وابستگی شدیدی به فایلها و سورسهای مشترک دارند باید اطمینان حاصل نمایید که این ماژولها فقط به اطلاعات مورد نیاز دسترسی دارند. این اصل interface segregation principle اصول SOLID است.
»توابعی که کاربرد زیادی دارند و اصطلاحا به عنوان Utility شناخته میشوند باید به rootScope$ اضافه شوند تا scopeهای وابسته نیز به آنها دسترسی داشته باشند. این مورد به ویژه باعث کاهش تکرار وابستگیهای مربوط به هر کنترلر میشود.
»برای جداسازی وابستگیهای بین دو component بهتر از eventها استفاده نمایید. AngularJs این امکان را با استفاده از سرویسهای on$ و emit$ و broadcast$ به راحتی میسر کرده است.
مشکلی که داشتم با نمونه مثال عنوان شده این کتابخانه در dot NET Core این بود :
به همین خاطر سعی کردم تا کدهای کتابخانه jqGridHelper قدیمی که بر روی نسخه قبلی ASP.NET MVC به راحتی برای انواع بانکهای اطلاعاتی از قبیل SQL Server و MongoDB کار میکرد را تغییراتی بدهم تا بتوان از این مثال برای استفاده در dot Net Core در انواع بانکهای اطلاعاتی SQL Server و MongoDB و غیره که قبلا استفاده میشد به راحتی استفاده کرد و هم کدنویسی سمت سرور برای نمایش و فیلترینگ انواع گریدها را به شدت کاهش میدهد
Demo-AspNetCore-JqGrid.rar
مجوز WTFPL
در بین مجوزهای سورس باز، یکی از اونها که اتفاقا مورد پذیرش FSF هم هست، عنوان جالبی داره که ترجمهاش به فارسی میشود: "برو هر غلطی که دلت میخواد باهاش بکن!" یا WTFPL = Do What The F.u.c.k You Want To Public License
نگارش یک این مجوز توسط Banlu Kemiyatorn نویسنده برنامه Window maker در سال 2000 ارائه شده و در سال 2007 توسط مدیر پروژه تیم Debian نگارش دوم آن ارائه گردیده است!
این مجوز به شما اجازه هر نوع تغییر یا هر روش توزیعی را در مورد برنامهی مورد نظر میدهد.
ترجمه این مجوز هم به زبان فارسی به صورت زیر است:
"
مجوز برو هر غلطی که دلت میخواد بکن!
نگارش 2، دسامبر 2004
هر کسی مجاز است این مستند را کپی یا توزیع کند با این شرط که اگر تغییری در اصل آن داده شد، نامش را تغییر دهد.
شروط اصلی این مجوز به شرح ذیل اعلام میگردد:
0- فقط برو هر غلطی که دلت میخواد باهاش بکن
"
البته شاید این سؤال پیش بیاد که این موارد به چه دلیلی اضافه شده؟ احتمالا شاید شنیده باشید که عدهای GPL رو یک نوع سرطان میدونند؛ از این لحاظ که اگر طرف اون رفتید باید کل برنامه خودتون رو سورس باز ارائه بدید. به همین جهت کسانی که کار تجاری انجام میدهند از طرف سورسهای پروژههای مبتنی بر GPL رد هم نمیشوند. در مقابل آن مجوزهایی مانند BSD یا MIT ملاحظات GPL را ندارند (+). در کل GPL تا به امروز لینوکس را زنده نگه داشته است.