در این پنل میتوان به اضافه ، ویرایش و حذف استایل هایی که به صفحهی جاری توسط فایلهای مختلف اضافه شده اند و یا داخل خود صفحه تعریف شده اند پرداخت.
همچنین در این پنل امکان ویرایش یک فایل css بصورت کامل وجود دارد ، به این صورت که میتوانید تمام محتویات فایل مورد نظر را در یک Text area ویرایش کنید.
مطابق با روالی که در قسمت قبل پیش گرفتیم عمل میکنیم و به ترتیب به تشریح ابزار پنل ، خود پنل ، منوی راست کلیک و پنل جانبی ِ Elements میپردازیم.
Options Menu
با راست کلیک کردن بروی تب CSS و یا کلیک کردن بروی فلش کوچک روی تب CSS قابل دسترس است و امکانات زیر را محیا میکند:
- Expand Shorthand Properties : نمایش دستورات css بصورت کامل ، به این معنی که دستوراتی مانند margin که هم بصورت خلاصه و هم بصورت کامل تعریف میشوند را بصورت کامل نمایش میدهد. مثلا margin را چهار مقدار margin-top , margin-right , margin-bottom , margin-left نمایش میدهد.
- Color As Hex , Color As RGB , Color As HSL : با انتخاب یکی از سه مقدار ذکر شده ، فرمت نمایش رنگها به حالت انتخاب شده تغییر میکند.
مثلا دستور color : #000000 به این صورت نمایش داده میشود : color : rgb(0, 0, 0) - Refresh : این گزینه محتویات پنل را بروز میکند.
Panel Toolbar
ابزاری موجود در این پنل مشابه پنلهای دیگر در بالای پنل و در زیر تب پنلها قرار دارد و شامل ابزارهای زیر میشود:
- Edit Button : این ابزار به دو صورت Live Edit و Source Edit در دسترس هست که با کلیک بروی فلش کوچکی که در سمت راست دکمه قرار دارد میتوان نوع آن را تغییر داد.
انتخاب حالت Source Edit ، باعث میشود سورس فایل به همان صورتی که به مرورگر ارسال شده نمایش داده شود. ( کامنتها ، فرمت فایل و ... حفظ میشود. )
حالت Live Edit هم باعث نمایش محتویات فایل بصورت مرتب شده میشود. ( کامنتها و دستوراتی که توسط مرورگر تفسیر نشده اند نمایش داده نمیشوند. ) - CSS Location Menu : نام فایل جاری که در پنل در حال نمایش است را نمایش میدهد و همچنین با کلیک بروی آن ، فایلهای استایل دیگری که در صفحه بارگزاری شده اند را نمایش میدهد. با کلیک بروی هرکدام از فایلهای نمایش داده شده ، همان فایل در پنل باز میشود.
استایل هایی که در خود صفحه تعریف شده اند با نام خود صفحه در این قسمت نمایش داده میشوند و اگر استایلهای در چندین تگ style تعریف شده باشند ، دومین تگ با #2 ، سومین با #3 و ... مشخص میشوند.
هنگام باز بودن :
1- فایل هایی که از پوشههای مختلف در صفحه بارگذاری شده اند ، با نام پوشه از هم تفکیک شده اند:
2- با تایپ کردن عبارت دلخواه میتوان نتایج را محدود کرد:
Panel
منظور از پنل ، قسمتی هست که استایل بصورت فرمت شده و نمایش داده شده است.
Infotips
توسط این قابلیت ، زمانی که موس را بروی آدرس تصاویر ، نوع فونت و ... ببرید ، پاپ آپ کوچکی باز میشود و اطلاعاتی در مورد مقادیر میدهد. مثلا اینکه آیا تصویر مورد نظر به درستی بارگذاری شده یا نه ، نمای کوچکی از تصویر ، شکل فونت و ...
Editing rules
برای ویرایش تعاریف CSS شامل Selectorها ، دستورات و مقادیر ، این پنل ابزارهای مفیدی ارائه میکند.
برای ویرایش یک selector ، دستور یا مقدار آن بروی آن عبارت کلیک کنید ، در همین حال یک text box ظاهر میشود و میتوانید مقدار جدید را وارد کنید. پس از انجام ویرایش مورد نظر بروی قسمتی از صفحه کلیک کنید یا کلید Tab سپس Esc را بزنید. برای ویرایش دستورات بعدی ، کلید Tab را بزنید و برای لغو تغییر جاری ، کلید Esc را بزنید.
برای ایجاد یک rule جدید ، بروی قسمتی از پنل راست کلیک کرده و سپس گزینهی "New Rule..." را برگزینید.
برای ایجاد یک property هم چند راه وجود دارد:
- بروی قسمت از فضای خالی تعریف یک استایل دوبار کلیک کنید.
- در قسمتی از تعریف یک استایل راست کلیک کرده و گزینهی "New Property..." را انتخاب کنید.
- بروی مقدار آخرین property کلیک کرده و کلید Tab را بزنید.
هنگام ویرایش یا ایجاد یک Rule , Propery یا مقدار بصورت inline ، حاشیهی text box متناسب با مقدار وارد شده رنگی را که نمایانگر حالت ذخیرهی مقدار وارد شده است نمایش میدهد. برای مثال اگر مقداری که برای یک selector وارد شده است نامعتبر باشد ، رنگ حاشیهی text box قرمز میشود.
جدول زیر حالتهای مختلف را شرح میدهد:
رنگ حاشیه | Selectorها | نام Properyها | مقادیر Propertyها و Ruleها |
خاکستری | تغییری ایجاد نشده است | تغییری ایجاد نشده است | تغییری ایجاد نشده است |
قرمز | selector نامعتبر است | نام نامعتبر است | مقدار نامعتبر است |
زرد | selector صحیح است اما بروی Element فعلی تاثیر ندارد | نام صحیح است اما مقدار Property غیر مجاز است یا وارد نشده است | |
سبز | selector صحیح است | نام و مقدار صحیح هستند | مقدار صحیح است |
Auto-completion
زمانی که در حال ایجاد/ویراش کردن یک Rule, Propery یا مقدار آنها هستید ، میتوانید از این قابلیت استفاده کنید. مثلا با وارد کردن # تمام Selector هایی که میتوانند با # شروع شوند در دسترس شما هستند و با دکمههای Up/Down میتوانید مقادیر ممکن را مرور کنید.
اگر در حال ویرایش یک مقدار عددی هستید ، میتوانید با دکمههای Up/Down مقادیر را یک واحد یک واحد افزایش دهید. با نگه داشتن کلید Shift و فشردن Up/Down میتوانید مقادیر را 10تا 10تا تغییر دهید و با نگه داشتن Ctrl بجای Sihft ، یک دهم یک دهم.
Toggling styles
با این امکان میتوانید یک Property را بطور موقت فعال/غیرفعال کنید. با حرکت موس از یک Property یک آیکون قرمز رنگ در کنار آن نمایش داده میشود که با کلیک بروی آن ، Property و مقدار آن کمرنگ شده و آیکون قرمز رنگ کنار آن ثابت میشود. با کلیک مجدد بروی آن ، Property فعال میشود.
Context Menu
این منو زمانی که در پنل راست کلیک کنید ظاهر میشود و نسبت به منطقه (Context)ای که در آن راست کلیک کرده اید ، گزینههای متفاوتی را مشاهده خواهید کرد. در جدول زیر ، گزینهها ، Contextشان و توضیح هر گزینه آمده است.
گزینه | Context | توضیحات |
Copy Location | CSS Location Menu | آدرس فایل استایل را در حافظه کپی میکند. |
Open in New Tab | CSS Location Menu | فایل استایل را در یک تب جدید باز میکند. |
Copy Image Location | image values | آدرس تصویر را در حافظه کپی میکند. |
Open Image in New Tab | image values | تصویر را در یک تب جدید باز میکند. |
Copy Color | color values | مقدار رنگ را در حافظه کپی میکند. |
Copy Rule Declaration | CSS selector | Selector و Propertyها را در حافظه کپی میکند. |
Copy Style Declaration | CSS selector | فقط Propertyها را در حافظه کپی میکند. |
New Rule... | همه جای پنل | یک Rule جدید بالای قسمتی که راست کلیک شده ایجاد میکند. |
Delete "<selector>" | CSS selector | Rule را حذف میکند. |
New Property... | CSS rule | یک Property جدید در Ruleی که در آن راست کلیک شده ایجاد میکند. |
Edit "<property name>"... | CSS property | Property فعلی به حالت ویرایش درمی آید. ( راه سادهتر ، کلیک بروی Property است. ) |
Delete "<property name>"... | CSS property | Property فعلی را حذف میکند. |
Disable "<property name>"... | CSS property | Property فعلی را غیرفعال میکند. |
Refresh | همه جای پنل | محتویات پنل را بروز رسانی میکند. |
Inspect in DOM panel | CSS Location Menu, CSS rule | فایل استایل یا Rule را در پنل DOM باز میکند. |
Elements Side Panel
در این پنل که سمت راست پنل CSS قرار دارد ، با وارد کردن یک CSS Selector میتوانید Elementهایی که در صفحه با آن مطابقت دارند را مشاهده کنید.
برای وارد کردن CSS Selector هم میتوان مقدار مورد نظر را در قسمت Try a selector... وارد کرد هم میتوان بروی یکی از Selectorهای پنل راست کلیک کرد و گزینهی Get Matching Elements را برگزید.
Context Menu این قسمت هم مشابه Context Menu پنل HTML هست و فقط در ورژن 1.11 گزینهی Paste HTML اضافه شده که در این کامنت از مقالهی آموزش فایرباگ - #5 - HTML Panel توضیح داده شده است.
در این مقاله قصد داریم نحوه مونیتور کردن میزان مصرف CPU توسط اس کیوال سرور را بررسی کنیم. برای بدست آوردن میزان CPU مصرفی اس کیوال سرور میتوان به اسکریپت زیر رجوع کرد:
DECLARE @CPU_BUSY int, @IDLE int
SELECT @CPU_BUSY = @@CPU_BUSY, @IDLE = @@IDLE WAITFOR DELAY '000:00:01'
SELECT (@@CPU_BUSY - @CPU_BUSY)/((@@IDLE - @IDLE + @@CPU_BUSY - @CPU_BUSY) *1.00) *100 AS 'CPU Utilization by sqlsrvr.exe'
در ادامه قصد داریم، هر 5 دقیقه به صورت خودکار بررسی کنیم که آیا میزان مصرف CPU در اس کیوال سرور بالای 50 درصد است؟ و اگر بله، ایمیلی را به مسؤول مربوطه جهت بررسی ارسال کنیم.
بنابراین اولین کاری که باید صورت گیرد، فعال سازی Database Mail در اس کیوال سرور است که به صورت پیش فرض غیرفعال است. برای این منظور تنها کافی است اسکریپت زیر را بر روی سرور اجرا کنید:
USE [master]
GO
sp_configure 'show advanced options',1
GO
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'Database Mail XPs',1
GO
--RECONFIGURE
GO
-- Create a New Mail Profile for Notifications
EXECUTE msdb.dbo.sysmail_add_profile_sp
@profile_name = 'DBA_Notifications',
@description = 'Profile for sending Automated DBA Notifications'
GO
-- Set the New Profile as the Default
EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
@profile_name = 'DBA_Notifications',
@principal_name = 'public',
@is_default = 1 ;
GO
-- Create an Account for the Notifications
EXECUTE msdb.dbo.sysmail_add_account_sp
@account_name = 'SQLMonitor',
@description = 'Account for Automated DBA Notifications',
@email_address = 'nasiri@site.net', -- Change This
@display_name = 'SQL Monitor',
@mailserver_name = 'mail.site.net' -- Change This
GO
-- Add the Account to the Profile
EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = 'DBA_Notifications',
@account_name = 'SQLMonitor',
@sequence_number = 1
GO
این اسکریپت برای اس کیوال سرورهای 2005 به بعد طراحی شده و تنها دو سطر آنرا پیش از اجرا باید ویرایش کنید. سطر مربوط به email_address و mailserver_name . آدرس ایمیل درحقیقت آدرس ایمیل قسمت from پیغام ارسالی را تشکیل میدهد. نام سرور میل هم، منظور آدرس smtp server شما در شبکه است.
یا اگر علاقمند بودید که اینکار را توسط ویزاردهای management studio انجام دهید (که در نهایت هیچ تفاوتی با اسکریپت فوق نخواهد داشت)، میتوان به این مقاله رجوع کرد.
پس از اجرای اسکریپت فوق، برای بررسی صحت عملکرد فوق میتوان دستور زیر را اجرا کرد:
--test
EXECUTE msdb.dbo.sp_send_dbmail
@recipients = 'nasiri@site.net', -- Change This
@Subject = 'Test Message generated from SQL Server DatabaseMail',
@Body = 'This is a test message from SQL Server DatabaseMail'
تا اینجا اس کیوال سرور برای ارسال ایمیل آماده شد. در ادامه قصد داریم یک job جدید در اس کیوال سرور ایجاد کنیم تا تمام موارد فوق را لحاظ کند.
مطابق تصویر فوق ابتدا یک job جدید را آغاز خواهیم کرد.
در ادامه اسکریپت زیر را جهت اجرا به آن معرفی میکنیم. توسط این اسکریپت، میزان جاری مصرف CPU اس کیوال سرور محاسبه شده و اگر این میزان بیشتر از 50 بود، یک ایمیل به مسؤول مربوطه با ذکر میزان CPU usage ارسال میگردد.
DECLARE @CPUUsage INT
DECLARE @CPU_BUSY INT,
@IDLE INT
SELECT @CPU_BUSY = @@CPU_BUSY,
@IDLE = @@IDLE
WAITFOR DELAY '000:00:01'
SELECT @CPUUsage = (@@CPU_BUSY - @CPU_BUSY) / ((@@IDLE - @IDLE + @@CPU_BUSY - @CPU_BUSY) * 1.00)
* 100 -- CPU Utilization by sqlsrvr.exe
IF @CPUUsage > 50
BEGIN
DECLARE @msg NVARCHAR(1000)
SET @msg = 'Please check SQL server, CPU usage is ' + CAST(@CPUUsage AS NVARCHAR(50))
+ '%.'
EXECUTE msdb.dbo.sp_send_dbmail
@recipients = 'nasiri@site.net', -- Change This
@copy_recipients = 'nasiri@site.net', -- Change This
@Subject = 'CPU overload',
@Body = @msg
,@importance = 'High'
END
و در آخر زمان اجرای آن را به هر روز، هر 5 دقیقه یکبار تنظیم خواهیم کرد.
اگر نیاز به راه حلی پختهتر و بررسی متوسط چندین مقدار قبلی ، مقایسه آنها و سپس ارسال ایمیل داشتید، میتوان به فصل 14 کتاب Super SQL Server Systems مراجعه کرد.
در ویندوز XP زمانیکه زبان سیستم و همچنین کشور جاری به ایران تنظیم شود، VS.Net فایلهای ANSI را از نوع ANSI-Windows-1256 (یا همان ANSI-Arabic) در نظر میگیرد و مشکلی هم برای ذخیره دادههای یونیکد در این نوع فایلهای ANSI ویژه نخواهد بود (الزامی وجود ندارد که این فایلها حتما به فرمت UTF8 ذخیره شوند). اما در ویندوز 7 با همان تنظیمات، VS.Net این فایلها را با encoding از نوع windows-1252 تشخیص میدهد و پس از کامپایل برنامهای که قبلا مشکل نداشت، اینبار همه چیز به همه ریخته خواهد بود. شاید اینطور به نظر برسد که این فایلها خراب شدهاند، ولی خیر. مشکلی وجود ندارد؛ فقط فرمت encoding خواندن آنها باید windows-1256 باشد (و نه 1252) و گرنه تخریب شده به نظر میرسند.
تعداد فایلها هم زیاد است و نیاز به یک روش سریع برای رفع این مشکل وجود داشت.
بنابراین سه عملیات باید صورت گیرد:
لیست کردن تمام فایلهای مورد نظر (فایلهای cs و aspx و امثال آن فقط)
پیدا کردن encoding جاری فایلها : کدامیک از آنها با فرمت UTF-8 ذخیره نشدهاند؟
تبدیل به یونیکد: خواندن این فایلهای غیر یونیکد یافت شده با فرمت windows-1256 و سپس ذخیره مجدد با فرمت UTF-8
که خلاصه روش انجام کار به صورت زیر است:
الف) آیا فایل جاری مورد نظر با فرمت UTF-8 with signature ذخیره شده است؟
این signature در مورد فایلهای UTF-8 به سه بایت اول فایل بر میگردد که اصطلاحا byte-order mark یا BOM گفته میشود و باید مساوی EFBBBF باشد. چون فایلهای ANSI این امضا را ندارند، در یک سیستم ممکن است 1256 خوانده شوند و در یک سیستم دیگر 1252 یا نوعهای ANSI دیگر بسته به تنظیمات جاری سیستم و مشکل اصلی از VS.Net نیست.
/// <summary>
/// آیا فایل مورد نظر با فرمت یونیکد دارای امضا ذخیره شده است؟
/// </summary>
/// <param name="filePath">فایل ورودی</param>
/// <returns>بله یا خیر</returns>
public static bool IsUTF8(string filePath)
{
using (FileStream file = new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read))
{
if (file.CanSeek)
{
byte[] bom = new byte[4]; // Get the byte-order mark, if there is one
file.Read(bom, 0, 4);
if ((bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)) // utf-8
{
return true;
}
else
{
return false;
}
}
else
{
//احتمالا فایل بایناری است
return false;
}
}
}
ب) خواندن یک فایل ANSI عربی با فرمت windows-1256 بدون تخریب اطلاعات آن و سپس ذخیره سازی با فرمت UTF-8
/// <summary>
/// تبدیل یک فایل انسی عربی به یونیکد دارای امضاء
/// </summary>
/// <param name="path">مسیر ورودی</param>
public static void FixWindows1256(string path)
{
try
{
//باز کردن فایل با فرمت انسی عربی و تبدیل به یونیکد
string data = File.ReadAllText(path, Encoding.GetEncoding("windows-1256"));
//نوشتن حاصل یونیکد در جای قبلی با فرمت مربوطه
File.WriteAllText(path, data, Encoding.UTF8);
}
catch (Exception ex)
{
//دسترسی وجود ندارد یا امثال آن
Console.WriteLine(ex.ToString());
}
}
پ.ن.
جالب اینجا است که این نوع فایلهای ANSI عربی در وب زیاد پیدا میشوند. برای مثال اینجا کلیک کنید. تمام این نوع فایلها را با متد فوق میتوان بدون تخریب اطلاعات به فرمت UTF-8 دارای امضاء اصلاح کرد.
دریافت نصاب NET Core 1.1.
برای این منظور به آدرس https://www.microsoft.com/net/download/core مراجعه کرده و فایل NET Core 1.1 SDK - Installer. را دریافت و نصب کنید. برای ظاهر شدن این گزینه باید حالت Current را بجای LTS (Long Term Support) انتخاب کرد:
همچنین در اینجا بسته NET Core 1.1 runtime - Installer. را هم جداگانه میتوان دریافت و نصب کرد.
به روز رسانی فایلهای global.json پروژهها
اولین کاری را که باید پس از نصب نگارشهای جدید NET Core. انجام داد، به روز رسانی شماره نگارش SDK درج شدهی در فایلهای global.json تمام پروژههای موجود است. در غیراینصورت NuGet بستههای جدید مرتبط با آنها را دریافت نخواهد کرد و آنها را در لیست به روز شدهها نخواهید یافت.
برای این منظور خط فرمان را گشوده و دستور ذیل را صادر کنید:
C:\>dotnet --version 1.0.0-preview2-1-003177
{ "projects": [ "src", "test" ], "sdk": { "version": "1.0.0-preview2-1-003177" } }
اصلاح فایل project.json پس از به روز رسانی فایل global.json
در ادامه باید فایل project.json نیز اندکی ویرایش شود تا شماره platform جدید را نیز درج کند. همچنین محل قرارگیری یکسری از بستهها نیز باید تغییر کنند. در غیر اینصورت با اولین کامپایل Solution چنین خطاهایی را دریافت خواهید کرد:
Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'. The project does not list one of 'win10-x64, win81-x64, win8-x64, win7-x64' in the 'runtimes' section.
"frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" } }, "imports": [ "dnxcore50", "portable-net45+win8" ] } },
یک نکته: اگر هنوز Microsoft.NETCore.App را در لیست dependencies ابتدای فایل project.json دارید، آنرا حذف کنید؛ چون در قسمت frameworks فوق درج شدهاست. در غیراینصورت پیام تکراری بودن این کلید را دریافت خواهید کرد.
پس از طی دو مرحلهی فوق، یکبار پروژه را بسته و مجددا باز کنید.
به روز رسانی بستههای نیوگت پایدار
قبل از هر کاری مطمئن شوید که آخرین بستهی خود NuGet را نیز نصب کردهاید (مهم). به روز رسانیهای اخیر آن بیشتر در جهت سازگاری با پروژههای NET Core. است.
https://dist.nuget.org/index.html
در ادامه برای به روز رسانی بستههای نیوگت، میتوان بر روی گره References کلیک راست کرد و سپس انتخاب گزینهی Manage NuGet Packages و در آخر انتخاب برگهی Updates و انتخاب کتابخانههای به روز شده. این روش برای حالت داشتن چندین پروژه در یک Solution اندکی کند است.
روش سریعتر که تمام پروژهها را نیز به صورت خودکار بررسی و به روز میکند، مراجعه به کنسول پاورشل نیوگت و سپس صدور دستور ذیل است:
PM> Update-Package
به علاوه پس از پایان کار، یکبار به طور کامل ویژوال استودیو را بسته و مجددا باز کنید. سپس این دستور را یکبار دیگر هم صادر کنید.
به روز رسانی بستههای نیوگت آزمایشی
یکسری از بستهها مانند Microsoft.AspNetCore.Razor.Tools تنها با انتخاب حالت include prereleases ظاهر میشوند که آنها را نیز باید به روز کرد:
تغییر مهم ابزارهای EF Core
در کل Solution عبارت Microsoft.EntityFrameworkCore.Tools را جستجو کرده و با نام جدید Microsoft.EntityFrameworkCore.Tools.DotNet جایگزین کنید.
در آخر یک نمونه فایل project.json به روز شدهی یک برنامهی ASP.NET Core 1.1 را در ذیل مشاهده میکنید:
{ "dependencies": { "Microsoft.AspNetCore.Diagnostics": "1.1.0", "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.1.0", "Microsoft.AspNetCore.Http.Extensions": "1.1.0", "Microsoft.AspNetCore.Mvc": "1.1.0", "Microsoft.AspNetCore.Mvc.Core": "1.1.0", "Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0", "Microsoft.AspNetCore.Razor.Runtime": "1.1.0", "Microsoft.AspNetCore.Razor.Tools": { "version": "1.1.0-preview4-final", "type": "build" }, "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0", "Microsoft.AspNetCore.Server.Kestrel": "1.1.0", "Microsoft.AspNetCore.Session": "1.1.0", "Microsoft.AspNetCore.SpaServices": "1.0.0-beta-000019", "Microsoft.AspNetCore.StaticFiles": "1.1.0", "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.InMemory": "1.1.0", "Microsoft.EntityFrameworkCore.Tools.DotNet": { "version": "1.1.0-preview4-final", "type": "build" }, "Microsoft.Extensions.Configuration.Binder": "1.1.0", "Microsoft.Extensions.Configuration.Json": "1.1.0", "Microsoft.Extensions.Logging.Console": "1.1.0", "Microsoft.Extensions.Logging.Debug": "1.1.0", "Microsoft.VisualStudio.Web.CodeGeneration.Tools": { "version": "1.1.0-preview4-final", "type": "build" }, "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": { "version": "1.1.0-preview4-final", "type": "build" } }, "tools": { "BundlerMinifier.Core": "2.2.301", "Microsoft.AspNetCore.Razor.Tools": "1.1.0-preview4-final", "Microsoft.VisualStudio.Web.CodeGeneration.Tools": { "version": "1.1.0-preview4-final", "imports": [ "portable-net45+win8" ] }, "Microsoft.EntityFrameworkCore.Tools.DotNet": { "version": "1.1.0-preview4-final", "imports": [ "portable-net45+win8" ] }, "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final" }, "frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" } }, "imports": [ "dnxcore50", "portable-net45+win8" ] } }, "buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true }, "runtimeOptions": { "configProperties": { "System.GC.Server": true } }, "publishOptions": { "include": [ "wwwroot", "Features", "appsettings.json", "web.config" ] }, "configurations": { "Release": { "buildOptions": { "optimize": true, "platform": "anycpu" } } }, "scripts": { "precompile": [ "dotnet bundle" ], "prepublish": [ //"bower install" ], "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] } }
به روز رسانی پروژهی Test
اگر از MSTest برای انجام آزمونهای واحد استفاده میکنید، تغییرات فایل project.json آن نیز شامل تغییر شماره نگارش NETStandard.Library به 1.6.1 است و همچنین خود بستههای mstest نیز به روز شدهاند. به علاوه قسمت frameworks آن نیز باید همانند مطالبی که عنوان شد، به روز شود:
{ "version": "1.0.0-*", "testRunner": "mstest", "dependencies": { "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.InMemory": "1.1.0", "NETStandard.Library": "1.6.1", "dotnet-test-mstest": "1.1.2-preview", "MSTest.TestFramework": "1.0.6-preview" }, "frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" } }, "imports": [ "dnxcore50", "portable-net45+win8" ] } } }
Side Panels
در پنل HTML درکنار ارائه امکاناتی برای مشاهده و کار با تگهای صفحه ، اطلاعات و امکانات دیگری هم برای تگ انتخاب شده در قسمت NodeView وجود دارد.
در این تب استایل هایی که در حال حاظر بروی تگ انتخاب شده اعمال شده اند ، نمایش داده میشود.
در صورتی که موس را بروی مقادیر استایل هایی که جلوهی بصری دارند بگیرید ، یک پاپآپ کوچک نمایان میشود که مقدار را نمایش میدهد.
Options Menu
هر تب یا پنل در فایرباگ دارای یک سری تنظیمات است که Options Menu نام دارد. تب Style هم دارای یک سری تنظیمات است که دانشتن آنها بسیار به شما کمک خواهد کرد.
این منو با کلیک کردن بروی فلش تب () یا راست کلیک کردن بروی تب ظاهر میشود.
- Only Show Applied Styles
در صورت انتخاب ، فقط استایل هایی که اعمال شده اند نمایش داده میشوند. (استایلهای Overwrite شده نمایش داده نمیشوند.)
(این گزینه قابلیت خوبی است ، اما چندبار برای بنده پیش آمده که این مورد به اشتباه استایلی که اعمال شده بود را هم Overwrite شده در نظر گرفته بود. پس در هین طراحی استایل و کار با CSS اگر احیانا یکی از استایل هایتان وجود نداشت و از وجود آن اطمینان داشتید ، غیرفعال کردن این گزینه را امتحان کنید.)
- Show User Agent CSS
با فعال کردن این گزینه ، استایل هایی که توسط مرورگر اعمال شده اند هم نمایش داده میشوند.
- Expand Shorthand Properties
با فعال کردن این گزینه ، استایل هایی که بصورت کوتاه شده تعریف شده اند را بصورت گسترده و باز شده نمایش میدهد.
برای مثال ، دستور margin را بصورت margin-top , margin-right , margin-bottom , margin-left نمایش میدهد.
- سه گزینه ی Colors As Hex ، Colors As RGB و Colors As HSL تعیین کنندهی فرمت نمایش رنگها هستند.
- سه گزینه ی :active ، :hover و :focus هم برای تعیین کلاس کاذب برای تگ جاری کاربرد دارند.
برای مثال شما میخواهید استایلی که یک لینک زمان موس برویش قرار دارد را بررسی کنید ، لینک را در NodeView انتخاب میکنید و سپس از گزینهی :hover را فعال میکنید.
Panel
- Element styles
استایل هایی که بصورت inline (در خود تگ) تعریف شده اند هم در این قسمت نمایش داده میشود و نام rule آن element.style است.
- Source Links
در بالا-راست هر بخش ، یک لینک قرار دارد که لینک فایل استایلی است که در همان قسمت وجود دارد و عددی که در پرانتز قرار دارد ، شماره خط استایل در همان فایل است.
اگر نام فایل با نام صفحهی جاری برابر باشد ، به معنی وجود استایل در تگ <style> در صفحهی جاری است و شمارهی بعد از # هم ایندکس تگ <style> است.
(با کلیک بروی لینک فایل ، فایل در خط مورد نظر در پنل CSS نمایش داده میشود.)
- Inherited rules
ruleهای به ارث رسیده هم در قسمتهای جداگانه به همراه استایلهای به ارث رسیده نمایش داده میشود و تگی والد که استایلها از آن به ارث رسیده اند هم در قسمت عنوان همان استایلها نمایش قرار داده شده است. (با کلیک بروی آن ، در قسمت Nodeview انتخاب میشود.)
- User agent rules
استایل هایی که توسط مرورگر اعمال شده اند (User agent rules) ، با عبارت <System> در زیر لینک منبع استایل ، مشخص شده اند.
- Overwritten styles
استایلهای overwrite شده ، با یک خط برویشان مشخص شده اند.
- Inline editing
استایلهای نمایش داده شده در این پنل را براحتی و با کلیک کردن بروی نام یا مقدار هر یک از دستورات میتوانید تغییر دهید.
برای نوشتن دستورات و مقادیر آنها میتوانید از پیشنهادهای فایرباگ هم کمک بگیرید و با دکمههای Arrow Up و Arrow Down هم بین مقادیر مجاز حرکت کنید.
دستورات یا مقادیر نا صحیح در هین تایپ ، با رنگ قرمز و مقادیر صحیح با رنگ سبز مشخص میشوند.
(این امکان خیلی مفید است ، برای مثال میخواهید فونتهای مختلف را برای یک استایل امتحان کنید ، دستور font-family را مینویسید و بعد از زدن Enter ، با دکمه های Arrow Up و Arrow Down در لحظه نتیجهی اعمال فونتهای مختلف و دردسترس را مشاهده میکنید و بهترین را بر میگزینید.
یا برای یافتن بهترین مقدار margin ، بعد از دستور margin ، زدن کلید Enter ، وارد کردن یک عدد برای شروع ، میتوان باز هم با دکمه های Arrow Up و Arrow Down به سرعت تغییر را در صفحه مشاهده کرد.)
- Rendered font highlighted
برای دستور font ، فایرباگ هوشمندانه عمل کرده و فونتی که در حال استفاده است را پررنگ میکند.
این امکان برای یافتن خطاهای متداول هنگام تعریف فونتهای غیر سیستمی ، بسیار مفید است.
Context Menu
این منو زمانی که در پنل راست کلیک کنید ظاهر میشود و نسبت به منطقه (Context)ای که در آن راست کلیک کرده اید ، گزینههای متفاوتی را مشاهده خواهید کرد. در جدول زیر ، گزینهها ، Contextشان و توضیح هر گزینه آمده است.
گزینه | Context | توضیحات |
Copy Rule Declaration | CSS selector | CSS Rule فعلی را به همراه استایل هایش در clipboard کپی میکند |
Copy Style Declaration | CSS selector | استایلهای CSS Rule فعلی را در clipboard کپی میکند |
Copy Location | source link | آدرس فایل تعریف CSS Rule را در clipboard کپی میکند |
Open in New Tab | source link | آدرس فایل تعریف CSS Rule را در تب جدید باز میکند |
Edit Element Style... | everywhere | امکان تعریف استایلهای درون تگ (inline) را محیا میکند |
Add Rule... | everywhere | یک Rule جدید ایجاد میکند CSS Rule هایی که در حال حاظر وجود دارد را هم پیشنهاد میدهد |
Delete "<rule name>" | CSS selector | CSS Rule فعلی را حذف میکند |
New Property... | CSS rule | یک استایل جدید به CSS Rule فعلی اضافه میکند |
Edit "<property name>"... | CSS property | Property فعلی را به حالت ویرایش میبرد راه دیگر ویرایش Property ، کلیک بروی آن است |
Delete "<property name>" | CSS property | Property فعلی را حذف میکند |
Disable "<property name>" | CSS property | Property فعلی را غیر فعال میکند را سریعتر ، کلیک کردن در ناحیهی پشت Property ، بروی علامت قرمز رنگ است |
Refresh | everywhere | محتویات پنل را بروز میکند |
Inspect in DOM Panel |
CSS rule | CSS Rule فعلی را در پنل DOM برای بررسی باز میکند |
Inspect in CSS Panel | CSS rule | CSS Rule فعلی را در پنل CSS برای بررسی باز میکند |
<Default Editor Name> | CSS rule | فایل تعریف استایلها را در ادیتور تعریف شده باز میکند (این گزینه در صورت تعریف ادیتور در تنظیمات FireBug نمایش داده خواهد شد) |
2 - Computed
دراین تب نتیجهی پردازش استایلهای ارائه شده توسط کاربر ، برای تگ مشخص شده در قسمت NodeView نمایش داده میشود. (مقادیر استایل هایی که در نهایت بروی تگ اعمال شده اند.)
Style Tracing
برای ردیابی استایلها ، استایلها به ترتیب اعمال شدنشان مرتب شده اند و اولین مقدار ، مقداری است که اعمال شده است.
مقادیر Overwrite بصورت خط کشیده شده و استایلهای Overwrite شده بصورت خاکستری-کمرنگ نمایش داده میشوند.
هر استایل هم مانند تب Style ، یک لینک به منبع خود دارد.
Options Menu
- Show User Agent CSS
در صورت انتخاب ، فقط استایل هایی که اعمال شده اند نمایش داده میشوند.
- Sort alphabetically
در صورت انتخاب ، استایلها به ترتیب الفبا ، و درصورت عدم انتخاب بصورت گروه بندی نمایش داده میشوند.
- Show Mozilla Specific Styles
در صورت انتخاب ، استایلهای مخصوص Mozilla را نمایش میدهد. (استایل هایی با پیشوند -moz-)
- سه گزینهی Colors As Hex ، Colors As RGB و Colors As HSL تعیین کنندهی فرمت نمایش رنگها هستند.
Context Menu
این منو زمانی که در پنل راست کلیک کنید ظاهر میشود و نسبت به منطقه (Context)ای که در آن راست کلیک کرده اید ، گزینههای متفاوتی را مشاهده خواهید کرد. در جدول زیر ، گزینهها ، Contextشان و توضیح هر گزینه آمده است.
گزینه | Context | توضیحات |
Expand All Styles | everywhere | CSS Rule فعلی را به همراه استایل هایش در clipboard کپی میکند |
Collapse All Styles | everywhere | استایلهای CSS Rule فعلی را در clipboard کپی میکند |
Inspect in DOM panel | styles | آدرس فایل تعریف CSS Rule را در تب جدید باز میکند |
Copy Location |
style source link | امکان تعریف استایلهای درون تگ (inline) را محیا میکند |
Open in New Tab | style source link | یک Rule جدید ایجاد میکند CSS Rule هایی که در حال حاظر وجود دارد را هم پیشنهاد میدهد |
Inspect in CSS panel | style source link | CSS Rule فعلی را حذف میکند |
<Default Editor Name> | style source link | فایل تعریف استایلها را در ادیتور تعریف شده باز میکند (این گزینه در صورت تعریف ادیتور در تنظیمات FireBug نمایش داده خواهد شد) |
3 - Layout
در این تب ، مقادیر Box Model بصورت بصری نمایش میدهد. میتوان با کلیک کردن بروی هریک از مقادیر ، آن را ویرایش کرد. (این تغییر بصورت inline در تگ اعمال میشود.)
با حرکت موس بروی قسمتهای مختلف ، میتوان همان قسمتها را در صفحه بصورت خط کشی شده مشاهده کرد.
(البته ظاهرا در ورژن 1.10.4 که بنده استفاده میکنم ، عملیات ویرایش مقادیر به درستی انجام نمیشود.)
Options Menu
- Show Rulers and Guides
در صورت انتخاب ، خطهای راهنما را هنگام حرکت موس بروی اجزای Box Model در صفحه نمایش میدهد.
4 - DOM
این پنل اطلاعات DOM تگ جاری را نمایش میدهد.
این پنل تمام قابلیتهای پنل DOM اصلی را دارا میباشد.
(در مقالات آینده با تب DOM آشنا خواهیم شد.)
ASP.NET MVC #5
متن باز بودن هم به معنای آزادی مطلق نیست. مثلا مجوز GPL به شما میگه که من سورس کارت رو هم میخوام اگر از کتابخانه من استفاده کردی یا اینکه باید با من به نحوی کنار بیای و هماهنگ کنی.
یا مجوز MIT میگه من نمیخوام و مهم نیست؛ یک تشکر برای من کافی است.
مجوز MS-PL بیشتر معنای (Shared source) رو از طرف مایکروسافت داره. به عبارتی مجاز هستید در فرم بایناری در هر نوع پروژهای از آن استفاده کنید. اما در حالت سورس، فقط جهت مرور و یا یافتن مشکلات امنیتی یا بررسیهای امنیتی در اختیار عموم قرار گرفته است (مثلا بعضی از دولتها به این مساله حساس هستند و سورس رو جهت بررسی امنیتی نیاز دارند). اما با این حال:
- مجاز هستید سورس رو تغییر بدید و حتی بفروشید اما باز هم تحت مجوز MS-PL
- اگر کاری جدیدی بر مبنای این سورس (نه بایناری آن که عنوان شد) تهیه شود، هم باید سورس را ارائه دهید و هم باز هم کل کار باید تحت مجوز MS-PL باشد.
رفتار مایکروسافت با این مجوز خاص خودش، فقط خواندنی است. یعنی پچی رو قبول نمیکنه.
به همین جهت این رفتار رو اخیرا اصلاح کردن و به مجوز آپاچی نقل مکان کردند و از حالت shared code فقط خواندنی بیشتر جهت بررسیهای امنیتی و مرور کد، به یک حالت پویاتر تبدیل شده.
// api.model.ts export interface Customer { id: number; name: string; } export interface User { id: number; isActive: boolean; }
// using the interfaces import { Customer, User } from './api.model'; export class MyComponent { cust: Customer; }
// api.model.ts namespace ApiModel { export interface Customer { id: number; name: string; } export interface User { id: number; isActive: boolean; } }
// using the interfaces export class MyComponent { cust: ApiModel.Customer; }
// api.v2.model.ts namespace ApiModel { export interface Order { id: number; total: number; } }
export class MyComponent { cust: ApiModel.Customer; order: ApiModel.Order; }
// api.model.d.ts interface Customer { id: number; name: string; }
// using the interfaces of d file export class MyComponent { cust: Customer; }
// lib.es5.d.ts type Partial<T> = { [P in keyof T]?: T[P]; };
import { Customer } from './api.model'; export class MyComponent { cust: Partial<Customer>; / ngOninit() { this.cust = { name: 'jane' }; } }
if (false) { console.log('x'); }
if (false) { // @ts-ignore console.log('x'); }
فرض کنید قصد دارید یک متد async از نوع IEnumerable را که تعدادی yield return به تاخیر افتاده را به همراه دارد (yield returnها فقط زمانی اجرا میشوند که بر روی آنها متدهایی مانند ToList و یا حلقهی foreach اجرا شوند) و همچنین توسط await Task.Delay، دریافت اطلاعات به صورت async را نیز شبیه سازی میکند، تهیه کنید:
public struct Statement { public int Id { get; } public string Description { get; } public Statement(int id, string description) => (Id, Description) = (id, description); public override string ToString() => Description; } public static async Task<IEnumerable<Statement>> GetStatements(bool error) { if (error) { throw new Exception("Oops, we messed up 😬"); } await Task.Delay(1000); //Simulate waiting for data to come through. yield return new Statement(1, "C# is cool!"); yield return new Statement(2, "C# orginally named COOL."); yield return new Statement(3, "More examples..."); }
The body of 'AsyncStreams.GetStatements(bool)' cannot be an iterator block because 'Task<IEnumerable<AsyncStreams.Statement>>' is not an iterator interface type (CS1624)
برای رفع یک چنین مشکلی، اکنون در C# 8.0 میتوان از اینترفیس جدید IAsyncEnumerable بجای Task IEnumerable استفاده کرد. به این ترتیب تنها تغییری که در قطعه کد فوق نیاز است، تغییر امضای آن به صورت زیر است:
static async IAsyncEnumerable<Statement> GetStatements(bool error)
امکان تعریف حلقههای async در C# 8.0
مرحلهی بعد، ایجاد حلقهای بر روی متد GetStatements است. اکنون مشکل دیگری وجود دارد: حلقهی foreach به خودی خود، یک حلقهی synchronous است و اگر از آن برای کار با یک استریم async استفاده شود، هربار که اطلاعاتی از آن بازگشت داده میشود، پایان یک Task نیز گزارش داده خواهد شد که میتوان سبب خاتمهی حلقه شود. بنابراین انجام اینکار نیز پیش از C# 8.0 میسر نبود که اکنون با امکان تعریف await پیش از یک حلقهی foreach، ممکن شدهاست:
static async IAsyncEnumerable<Statement> GetStatementsAsync(bool error) { await foreach (var statement in GetStatements(error)) { await Task.Delay(1000); yield return statement; } }
اینترفیس IAsyncEnumerable چگونه تعریف شدهاست؟
اینترفیس IAsyncEnumerable متد GetAsyncEnumerator را تعریف میکند که یک IAsyncEnumerator را بازگشت میدهد و آن نیز به همراه متد MoveNextAsync است. اگر دقت کنید در این حالت از نگارش async اینترفیس IDisposable به نام IAsyncDisposable استفاده کردهاست:
using System.Threading; namespace System.Collections.Generic { public interface IAsyncEnumerable<out T> { IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default); } public interface IAsyncEnumerator<out T> : IAsyncDisposable { T Current { get; } ValueTask<bool> MoveNextAsync(); } } namespace System { public interface IAsyncDisposable { ValueTask DisposeAsync(); } }
مثالی از IAsyncDisposable و روش Dispose خودکار آن
با معرفی IAsyncDisposable، اگر یک مثال ساده از پیاده سازی آن به صورت زیر باشد:
public class AwaitUsingTest : IAsyncDisposable { public async ValueTask DisposeAsync() { await Task.CompletedTask; } public void Dummy() { } }
async Task FooBar() { await using var test = new AwaitUsingTest(); test.Dummy(); }