از visual studio 2019 ورژن 16.9.4 استفاده میکنم
فایل gitIgnore ترکیبی از موارد visual studio و net Core.
نظرات مطالب
Subversion 1.6.0
با توجه به افزایش کاربرد jQuery و دیگر کتابخانههای جاوا اسکریپت در برنامههای تحت وب، یکی از چالشهای همیشگی برنامه نویسان، فشرده سازی فایلهای دربرگیرنده کدهای جاوا اسکریپت و شیوه نامهها می باشد. برای این منظور راههای مختلفی مانند استفاده از ابزارهای آنلاین مانند این + و این + وجود دارند. اما یک روش خودکار هم وجود دارد که در زمان Build پروژههای دات نت میتوان از آن بهره گرفت.
Microsoft Ajax Minifier
یک ابزار رایگان جهت فشرده سازی فایلهای جاوا اسکریپت و شیوه نامهها است. شما میتوانید این ابزار را از صفحه خانگی آن در سایت asp.net دریافت کنید. جهت استفاده از این ابزار میتوان از طریق خط فرمان عمل کرد. اما روش سادهتر که هدف اصلی این مطلب است به شرح زیر است:
1. در VisualStudio.NET از طریق منو به مسیر Tools, Options, Projects and Solutions بروید و گزینه Always show solution را تیک بزنید.
2. از Solution Explorer بر روی عنوان پروژه کلیک راست کرده و گزینه Unload Project را انتخاب نمایید.
3. مجدداً روی عنوان پروژه کلیک راست کرده و گزینه Edit را انتخاب کنید و دستورات زیر را قبل از بسته شدن تگ Project اضافه کنید:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\MicrosoftAjax\ajaxmin.tasks" /> <Target Name="AfterBuild"> <ItemGroup> <JS Include="**\*.js" Exclude="**\*.min.js;Scripts\*.js" /> </ItemGroup> <ItemGroup> <CSS Include="**\*.css" Exclude="**\*.min.css" /> </ItemGroup> <AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" CssSourceFiles="@(CSS)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".min.css" /> </Target>
4. دوباره بر روی عنوان پروژه کلیک راست کرده و گزینه Reload Project را انتخاب کنید.
توجه کنید که با این کار ما یک MSBuild task با عنوان ajaxmini به پروژه اضافه کردیم. این وظیفه که در زمان Build پروژه اجرا خواهد شد فایلهای جاوا اسکریپت را فشرده و با پسوند .min.js و همچنین فایلهای CSS را پس از فشرده سازی با پسوند .min.css در همان مسیر فایل مادر بطور خودکار ذخیره میکند.
نکته:
اگر به دستورات تنظیمات فوق نگاه دقیقتری بیندازیم، متوجه عبارات Include و Exclude می شویم. توسط این دو صفت شما میتوانید الگوهایی را جهت فشرده سازی و یا عدم فشرده سازی تعریف کنید. بدین معنا که توسط الگویهای ذکر شده در تنظیمات فوق از فشرده سازی فایلهای با پسوند .min.css و .min.js خودداری میشود.
در این شرایط در حین توسعه برنامه، شما میتوانید از فایلهای با کد خوانا استفاده نمایید و زمان انتشار و Build پروژه بصورت خودکار آنها را با فایلهای فشرده جایگزین کنید.
این ابزار تمامی فضاهای خالی، ';' و '{ }'های اضافی و توضیحات را از کدهای شما حذف میکند. متغیرها و توابع شما را به اسامی کوجکتر تغییر نام میدهد. و ...
همچنین شما از کتابخانه این پروژه میتوانید در زمان اجرا و سورس برنامه خود استفاده کنید. جهت اطلاعات بیشتر میتوانید به سایت مربوطه مراجعه نمایید.
این قهرمان ما از سال ۲۰۰۲ سفر خودش را همراه با Visual Studio 2002 شروع کرد و تا الان (۲۰۲۳) حدود ۱۱ بار آپدیتهای جدید و عالیای را ارائه دادهاست. در اوایل کار، زبانی شبیه به Java بود و صرفا نسبت به زبانهای سطح پایین، تنها چیزی که اضافه داشت، بحث شیءگرایی بود، اما در ادامه وارد عصرهای مختلفی شد که بد نیست نگاهی به آنها داشته باشیم.
عصر نخستین: تبدیل شدن به یک زبان قابل قبول
C# 1.0, C# 1.2, C# 2.0
در این عصر، زبانی را مشاهده میکنیم که تقریبا مانند بقیهی زبانهای C-Base هست و تفاوت چندانی نمیکند. میشود گفت اینجا کار کردن با انواع دادهها نسبت به بقیه زبانها آسانتر است. با قابلیتهای شیءگرایی شروع کرده و در ادامه ویژگیهای دیگری را هم در ورژنهای بعدی خود ارائه داد.
عصر دوم: اضافه شدن امکانات منحصر بفرد
C# 3.0 , C# 4.0, C# 5.0
حدود سال ۲۰۰۷، قهرمان ما تصمیم گرفت امکانات منحصر بفردی را ارائه دهد که این زبان را نسبت به بقیهی هم ردیفهای خودش متمایز کند. این امکانات همراه با NET Framework version 3.5 و Visual Studio 2008 وارد بازار شدند. امکانات نام آشنایی از قبیل Lambda expression ها،Object and collection initializerها و ... در این ورژن به سیشارپ اضافه شدند.
عصر سوم: باز نویسی کامل کامپایلر با سیشارپ (Roslyn)
سال ۲۰۱۵ سیشارپ ۶ همراه با Visual Studio 2015 وارد بازار شد. اینبار سیشارپ شروع به اعمال تغییراتی کرد که عمدتا با ذهنیت کد تمیز و ساده همراه بود. از جملهی این تغییرات مهم، بازنویسی کامل کامپایلر، با خود زبان سیشارپ بود.
عصر چهارم: رضایت طرفداران کد تمیز و ساده
شروع تغییرات کوچک، در ورژن ۶ سیشارپ بود؛ ولی از ورژن ۷ به بعد، مایکروسافت تمرکز خیلی بیشتری را بر روی این کار گذاشت و تغییراتش همگی دارای یک هدف مهم بودند. آسان و تمیز بودن کدها؛ امکاناتی از قبلی tuple,out,ref و ... از جمله این تغییرات بودند.
عصر پنجم: دنیای Cross-Platform، خداحافظی با NullReferenceException و تلاش برای شبیه شدن به زبانهای اسکریپت نویسی
سالها برنامه نویسها با خطای NullReferenceException دست و پنجه نرم میکردند، ولی حالا با استفادهی درست از قابلیت Nullable reference typeها میشد تا حد قابل قبولی جلوی این اتفاق را گرفت. در ادامه تغییرات به سمتی میرفت که زبان سیشارپ را شبیه به یک زبان اسکریپت نویسی کرده بود. حالا میشد بدون تعریف کلاس و متد خاصی، دستور سادهای را اجرا کرد. همچنین قابلیتهایی که در pattern matching به سیشارپ اضافه شد، باعث سادهتر و قابل فهمتر شدن سیشارپ میشد.
نقشهی راه تصویری پیشرفت سیشارپ
سؤالی شده به این مضمون : "یه الگوریتم دارم که بر طبق اون باید اعداد تصادفی خیلی بزرگ تولید کنم، اونها رو جمع و ضرب کنم. اینکه چطوری باید از dll یا lib استفاده کنم رو بلد نیستم. از VS2008 استفاده میکنم..."
سؤال در مورد زبان CPP است. کتابخانهی استاندارد انجام اینگونه عملیات برای زبانهای C و CPP ، کتابخانهی OpenSSL است. البته شاید الان 100 کتابخانه دیگر را هم لیست کنید، اما کسانی که با مباحث رمزنگاری اطلاعات مدتی کار کرده باشند، بعید است سر و کارشان به این کتابخانه نیفتاده باشد و یک استاندارد در این زمینه به شمار میرود؛ همچنین به دلیل سورس باز بودن در اکثر سکوهای کاری موجود نیز قابل استفاده است. بنابراین فراگیری نحوهی کار کردن با آن یک مزیت به شمار میرود. قسمتی از این کتابخانهی معظم مرتبط است به کار با اعداد بزرگ. این مورد را هم جهت استفاده در الگوریتم RSA نیاز دارد.
برای استفاده از آن در ویندوز ابتدا باید OpenSSL را کامپایل کنید. کار پر دردسری است. به همین جهت یک سایت فقط به این موضوع اختصاص یافته و هربار آخرین نسخهی OpenSSL را برای ویندوز کامپایل میکند و در اختیار علاقمندان قرار میدهد : +
در حال حاضر یا باید Win32 OpenSSL v1.0.0a و یا Win64 OpenSSL v1.0.0a را دریافت کنید (برنامهی شما اگر 64 بیتی کامپایل شود، dll های 32 بیتی را نمیتواند بارگذاری کند و برعکس).
روش استفاده از کتابخانهی OpenSSL در ویژوال CPP :
الف) ابتدا فایلهای کامپایل شدهی فوق را دریافت و نصب کنید. اکنون برای مثال یک پوشهی OpenSSL-Win32 در کامپیوتر شما با محتویات این کتابخانه باید ایجاد شده باشد(اگر نسخهی 32 بیتی را دریافت کردهاید).
سپس به پوشهی OpenSSL-Win32\lib\VC آن مراجعه کنید. در اینجا فایلهای کتابخانهای جهت استفاده در ویژوال CPP قرار گرفتهاند. اگر از محتویات پوشه OpenSSL-Win32\lib\VC\static استفاده کنید، نیازی به توزیع فایلهای DLL این کتابخانه نخواهید داشت و اگر از کتابخانههای OpenSSL-Win32\lib\VC استفاده کنید، فایلهای dll را نیز حتما باید به همراه برنامهی خود توزیع نمائید.
سه نوع فایل در آن وجود دارند. ختم شده به MD ، MT و MDd که معانی آنها در مورد چند ریسمانی بودن یا خیر است (برگرفته شده از فایل faq.txt دریافتی):
Single Threaded /ML - MS VC++ often defaults to this for the release version of a new project.
Debug Single Threaded /MLd - MS VC++ often defaults to this for the debug version of a new project.
Multithreaded /MT
Debug Multithreaded /MTd
Multithreaded DLL /MD - OpenSSL defaults to this.
Debug Multithreaded DLL /MDd
ب) جهت سهولت کار، پوشهی OpenSSL قرار گرفته در مسیر OpenSSL-Win32\include را در آدرس زیر کپی نمائید:
C:\Program Files\Microsoft Visual Studio 10.0\VC\include
به این صورت حین استفاده از این کتابخانه نیازی به مشخص سازی محل قرارگیری فایلهای include نخواهد بود.
ج) اکنون یک پروژهی جدید Visual C++\Win32\Win32 console application را در VS.NET آغاز کنید؛ برای مثال به نام OpenSSLTest .
د) سپس به منوی پروژه، گزینهی خواص پروژه مراجعه کرده و مطابق تصاویر زیر، این فایلهای کتابخانهای را معرفی کنید (انتخاب MD یا MT یا MDd بر اساس runtime library انتخاب شده است که در تصاویر مشخص گردیده):
ه) اکنون یک مثال ساده در مورد ضرب دو عدد بزرگ به صورت زیر میتواند باشد:
#include "stdafx.h"
#include <openssl/bn.h>
#include <string.h>
void RotateBytes(unsigned char *in, int n)
{
unsigned char *e=in+n-1;
do {
unsigned char temp=*in;
*in++=*e;
*e-- =temp;
} while(in<e);
}
int _tmain(int argc, _TCHAR* argv[])
{
//دو عدد بزرگ جهت آزمایش
unsigned char testP[] = {0xD1,0x31,0x85,0x4D,0x00,0xD6,0x31,0x97,0x3A,0xFC,0xD2,0x27,0x02,0xEF,0xC2,0xA7};
unsigned char testA[] = {0xC7,0x1B,0x25,0x72,0x03,0xCB,0x72,0x03,0xCF,0x23,0x27,0x2D,0x00,0xD6,0x31,0x98};
//تبدیل آرایههای فوق به فرمت اعداد بزرگ
BIGNUM *a = BN_new();
//it should be in "big-endian" form
RotateBytes(testA, 16);
BN_bin2bn(testA, 16, a);
BIGNUM *p = BN_new();
//it should be in "big-endian" form
RotateBytes(testP, 16);
BN_bin2bn(testP, 16, p);
//ضرب این دو عدد در هم
BIGNUM *result = BN_new();
BN_CTX *ctx = BN_CTX_new();
BN_mul(result, a, p, ctx);
//نمایش نتیجه
//حاصل از چند بایت تشکیل شده؟
int num = BN_num_bytes(result);
if(num>0)
{
unsigned char *tmpdata;
if((tmpdata=(unsigned char *)malloc(num)))
memset(tmpdata, 0, num);
//تبدیل عدد با فرمت اعداد بزرگ به آرایهای از بایتها
BN_bn2bin(result, tmpdata);
RotateBytes(tmpdata, num);
for(int i=0; i<num; i++)
{
if(i%16==0) printf("\n");
printf("%02X ",tmpdata[i]);
}
if(tmpdata) free(tmpdata);
}
//آزاد سازی منابع
BN_free(a);
BN_free(p);
BN_CTX_free(ctx);
return 0;
}
در مورد شرح توابع کتابخانه OpenSSL به اینجا مراجع کنید : +
علت استفاده از تابع RotateBytes ، تغییر endian ورودی است.
شخصی سازی using directives
موقعی که یک کلاس جدید را در VS.NET باز میکنید، فضاهای نامی مشخص و تکراری، همیشه به صورت پیش فرض صدا زده شدهاند و این فضاهای نام را مایکروسافت بر اساس بیشترین کاربرد و استفاده توسط برنامه نویسان قرار داده است؛ ولی در خیلی از اوقات این فضاهای نام پیش فرض، چنان هم برای خیلی از برنامه نویسان کاربردی نداشته یا با توجه به برنامه هایی که مینویسند همیشه متفاوت هست و هربار مجبورند فضاهای نام خاصی را صدا بزنند. برای مثال فضای نام System.ComponentModel.DataAnnotations را در نظر بگیرید که برنامه نویس میخواهد برای مدلهای نوشته شده خود از تگهای متا استفاده کند و باید در هرکلاس ساخته شده، یکبار مورد بالا را صدا بزند که بیشتر باعث کند شدن کار برنامه نویس میشود. پس باید کاری کنیم که پیش فرضهای فضای نام به آنچه خودمان میخواهیم تغییر پیدا کند.
برای این منظور، به محل نصب ویژوال استودیو رفته و مسیر زیر را دنبال کنید (به مسیر دقت کنید ،در اینجا زبان سی شارپ انتخاب شده است):
X:\...\IDE\ItemTemplates\CSharp\Code\1033
در اینجا تعدادی دایرکتوری با اسامی آشنا میبینید که داخل هر کدام از آنهای یک فایل به اسم class.cs هست و اگر آن را باز کنید یک نمونه یا قالب برای usingها قابل مشاهده است. برای مثال ما وارد دایرکتوری class میشویم و فایل class.cs را باز میکنیم:
using System; using System.Collections.Generic; $if$ ($targetframeworkversion$ >= 3.5)using System.Linq; $endif$using System.Text; $if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks; $endif$ namespace $rootnamespace$ { class $safeitemrootname$ { } }
یک سری از فضاهای نام که در تمامی فریمورکها استفاده میشوند به همان شکل عادی نوشته شدهاند. ولی آنهایی که از نسخهی خاصی از یک فریم ورک اضافه شدهاند باید توسط شرط مورد نظر اضافه شده و اعلام شود که این فضای نام از چه نسخهی فریم ورکی به بعد باید اضافه گردد:
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;//فضای نام مورد نظر $endif$
حال در همان دایرکتوری سی شارپ دقت کنید، میبینید که برای موارد دیگری هم فایل هایی وجود دارند. برای مثال برای اینترفیسها یا silverlight و ... که هر کدام را میتوانید جداگانه تغییر دهید.
نکته:احتمال دارد در نسخههای متفاوت به خصوص پایینتر مثل نسخه 8 ویژوال استودیو ، فایل class.cs به صورت zip باشد که بعد از تغییرات باید دوباره به حالت zip بازگردانده شود.
حذف فضای نامهای اضافی
هر موقع که کلاس جدیدی میسازیم، namespaceها به صورت پیش فرض که در بالا اشاره کردیم وجود دارند و شاید اصلا در آن کلاس از آنها استفاده نمیکنیم یا حتی خودمان در حین نوشتن کدها چند namespace خاص را اضافه میکنیم که شاید در طول برنامه نویسی چندتایی را بلا استفاده بگذاریم. برای همین همیشه فضای نام هایی صدا زده شدهاند که اصلا در آن کلاس استفاده نشدهاند. پس برای همین بهتر هست که این رفرنسهای بلا استفاده را پیدا کرده و آنها را حذف کنیم.
شاید این سوال برای بعضیهای پدید بیاد که چرا باید اینها را حذف کنیم، چون کاری هم با ما ندارند و ما هم کاری با آنها نداریم؟
این کار چند علت میتواند داشته باشد:
- تمیزکاری کد و خلوت شدن فضای کدنویسی
- ممکن هست بعدها گیج کننده شود که من چرا از اینها استفاده کردم؟ در آینده با نگاه به یک کد تمیزتر متوجه میشوید یک کد از چه چیزهایی برای انجام کارش بهرهمند شده و هم اینکه در کارهای گروهی و تیمی هم این مورد به شدت تاثیرگذار هست.
- باعث کند شدن تحلیلهای ایستا میشه (اینجا و اینجا )
- کمپایل شدن کد کندتر میشه
- موقع تست برنامه، اجرای اولیه کندتر خواهد بود چون CLR باید این نوع موارد را شناسایی و حذف کند
برای حذف فضاهای نام اضافی در یک صفحه میتوانید از طریق این مسیر انجام بدید:
Edit>IntelliSense >Organize Usings>Remove Unused using
برای مرتب سازی هم گزینه Sort Usings و انجام هر دو کار Remove and Sort موجود هست.
البته اگه روی صفحه هم راست کلیک کنید گزینه Organize Usings هم وجود دارد.
می توانید از ابزارهایی چون Power tools Extensions هم استفاده کنید (در صورتی که ویژوال استودیوی شما گزینههای مورد نظر را ندارد، این ابزار را نصب نمایید)
در صورتی که از ابزارهایی چون telerik یا devexpress استفاده میکنید یا از هر ابزار اضافی که بر روی IDE نصب میشود، عموما چنین گزینه هایی حتی با امکانات وسیعتر وجود دارند. مثلا whole tomato هم یکی از این ابزارهاست.
این نکته را هم خاطر نشان کنم در صورتیکه فضاهای نامی بین پیش پردازنده ها که در قبل توضیح دادیم محصور شده باشند، حذف نخواهند شد و همانطور باقی خواهند ماند.
در مورد کامنتهای بین usingها به قطعه کد زیر نگاه کنید:
using System; /* Comment before remains */ using /* Comment between removed */ System.Linq; // Comment after remains namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("My Example"); } } }
using System; /* Comment before remains */ // Comment after remains namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("My Example"); } } }
برای اینکه این عمل را بتونید در کل صفحات اعمال کنید میتوانید از cleanup selected code هم استفاده کنید؛ به جز اینکه فضاهای نام اضافی را هم پاک میکند، کلیه کدهای شما را در قالبی شکیلتر و خواناتر قرار خواهد داد.
با کلیدهای Ctrl+k+d سند انتخابی و با کلیدهای ترکیبی Ctrl+k+f هم محدوده انتخاب شده قالب بندی میشود.
ویژگی سی شارپ 6 در مورد Using
فرض کنید ما یک کلاس ایستا به نام utilities ایجاد کردیم که یک متد به اسم addints دارد. حالا و این کلاس در namespace به نام SomeNamespace قرار دارد. مطمئنا در این حالت ما ابتدا فضای نام را using میکنیم و سپس در کد کلاس، متد را به شکل زیر صدا میزنیم:
using System; using SomeNamespace; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int sum = Utility.AddInts(5, 2); Console.ReadLine(); } } }
به شکل زیر دقت کنید:
using System; using SomeNamespace.Utility; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int sum = AddInts(5, 2); Console.ReadLine(); } } }
نکته پایانی:در visual studio 2014 فضاهای نام اضافی به رنگ خاکستری نمایش داده میشوند.
منابع:
سلام،
چرا 8 مورد دیگر هم هستند:
http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/
بعلاوه لایور رایتر مایکروسافت به همراه پلاگین copy as html برای VS.Net
البته اگر منظور سایت جاری باشد این مشکل فکر نکنم به علت این syntax HL باشد، مشکل از اتمام پهنای باند سایت گوگل پیج است (خصوصا هنگام نمایش تصاویر صفحه از آن و یک سری بررسی جاوا اسکریپتی).
چرا 8 مورد دیگر هم هستند:
http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/
بعلاوه لایور رایتر مایکروسافت به همراه پلاگین copy as html برای VS.Net
البته اگر منظور سایت جاری باشد این مشکل فکر نکنم به علت این syntax HL باشد، مشکل از اتمام پهنای باند سایت گوگل پیج است (خصوصا هنگام نمایش تصاویر صفحه از آن و یک سری بررسی جاوا اسکریپتی).
نظرات مطالب
Ankh-SVN-2.0.6347
Ankh هم مثل TortoiseSVN زمانیکه گزینه Ankh –> Add solution to Subversion repository را انتخاب میکنید (با کلیک راست روی پروژه موجود در VS.Net) و مثلا آدرس svn://localhost/trunk را ارائه میدهید، پس از کلیک بر روی OK ، به صورت خودکار صفحه وارد کردن نام کاربری و کلمه عبور را نمایش میدهد.