Ubuntu is distributed on two types of images described below.
Desktop image
The desktop image allows you to try Ubuntu without changing your
computer at all, and at your option to install it permanently later.
This type of image is what most people will want to use. You will need
at least 384MiB of RAM to install from this image.
Server install image
The server install image allows you to install Ubuntu permanently on a
computer for use as a server. It will not install a graphical user
interface.
سلام
(نوع stub همانند فریم ورک mock میباشد )
تعریفی که از stup تو راهنماش اومده با مطلبی که شما ذکر کردید متفاوته
Martin Fowler’s article Mocks aren’t Stubs compares and contrasts the underlying principles of Stubs and Mocks. As outlined in Martin Fowler’s article, a stub provides static canned state which results in state verification of the system under test, whereas a mock provides a behavior verification of the results for the system under test and their indirect outputs as related to any other component dependencies while under test
واقعا Microsoft Open Sources .NET ؟
Immutability comes with a lot of benefits, but sometimes it can be a bit cumbersome to deal with when you only want to update some properties. Since the object is immutable, you need to create a copy with all the existing values and the new updated one.
I will show you how Records in C# 9 will greatly simplify this
Visual Studio 2017 15.6 منتشر شد
- We improved solution load performance by optimizing design time build.
- We've added installation progress details on Visual Studio Installer.
- You can pause your installation and resume at a later time.
- We streamlined the update process so the notification takes you directly to the Installer.
- Non-administrators can create a VS layout.
- We added a new shortcut for Edit.Duplicate in the keyboard mapping.
- We made significant improvements to the F# language and tools, particularly for .NET Core SDK projects.
- The C++ compiler optimizes your code to run faster through improved optimizations.
- C++ Mapfile generation overhead is reduced in full linking scenarios.
- Debug options are available for Embedded ARM GCC support.
- We added strong name signing on CoreCLR for the C# compiler.
- Visual Studio Tools for Xamarin has lots of new productivity updates for iOS and Android developers.
- Python no longer requires a completion DB, and Anaconda users have support for conda.
- The Performance Profiler's CPU Usage Tool can display logical call stacks for asynchronous code.
- The CPU Usage tool displays source line highlighting and async/await code with logical 'Call Stack Stitching'.
- The debugger supports thread names set via SetThreadDescription APIs in dump debugging.
- Snapshot Debugging can be started from the Debug Target dropdown for ASP.NET applications.
- We've launched the initial implementation of Navigate to decompiled sources for .NET code navigation.
- New enhancements for Configure Continuous Delivery include support for TFVC, Git authentication over SSH, and containerized projects.
- You can now click on the Continuous Delivery tile in Team Explorer to configure automated build and deployments for your application.
- Team Explorer supports Git tags and checking out pull request branches.
- Service Fabric Tooling for the 6.1 Service Fabric release is now available.
- The Windows 10 Insider Preview SDK can be installed as an optional component.
- File versions for a number of Visual Studio executables now reflect the minor release.
- Test Explorer has a hierarchy view and real time test discovery is now on by default.
- We have added support for testing Win10 IoT Core applications.
- Visual Studio Build Tools supports TypeScript and Node.js.
- ClickOnce Tools support signing application and deployment manifests with CNG certificate.
- You can access Azure resources such as Key Vault using your Visual Studio accounts.
As anyone in the .NET community who hasn't been living under a rock will know, there's a lot of exciting things happening with .NET at the moment with the announcement of the open source, cross platform, .NET Core. However, partly due to the very open nature of its evolution, there's been a whole host of names associated with its development - vNext, ASP.NET 5, ASP.NET Core, .NET generations etc.
In this post I'm going to try and clarify some of the naming and terminology surrounding the evolution of the .NET framework. I'll discuss some of the challenges the latest iteration is attempting to deal with and how the latest developments aim to address these.
This is really for those that have seen some of the big announcements but aren't sure about the intricacies of this new framework and how it relates to the existing ecosystem, which was my situation before I really started digging into it all properly!
Hopefully by the end of this article you'll have a clearer grasp of the latest in .NET!
- بررسی ویرویس Stuxnet | www.idevcenter.com
- تایپ متن فارسی در Gmail | googlepersianblog.blogspot.com
- خصوصیات جدید در ASP.NET 4.5 - خصوصیت HTML Editor Smart Tasks and Event Handler Generation | mojtabasahraei.blogfa.com
- دیتابیس رنگی | www.dotnetdev.info
- شما مرغابی هستید یا عقاب؟ | hrnews.blogfa.com
- نقد فیلم "one flew over the cuckoos nest - دیوانه از قفس پرید( پرواز بر فراز آشیانه فاخته)" | filmhafteh.blogfa.com
- Addressing Visual Studio performance | blogs.msdn.com
- BUILD conference–day 3 | lostechies.com
- BUILD: WinRT, Silverlight, WPF, XAML | www.japf.fr
- C# and Visual Basic on the WinRT API | www.infoq.com
- Multi Monitor in VS.NET 2010 & SQL Server 2011 | www.nikamooz.com
- My List of Must-See Build 2011 Videos | 10rem.net
- New CSS editor features in Visual Studio 11 Developer Preview | blogs.msdn.com
- New Tools and New Content - ASP.NET, Visual Studio 11 Web and .NET 4.5 Developer Preview (with commentary) | www.hanselman.com
- Prototype xUnit.net Visual Studio 11 Unit Testing Plugin | bradwilson.typepad.com
- RIA Services updates for //build | feeds.jeffhandley.com
- Using WinRT from .NET | ermau.com
- Windows 8 and WinRT: Links, News and Resources | ajlopez.wordpress.com
- Windows 8 Replaces the Win32 API | www.infoq.com
- Windows 8: What you Need to Know | csharperimage.jeremylikness.com
- WinRT: An Object Orientated Replacement for Win32 | www.infoq.com
<embed height="400" width="500" flashvars="config=http://www.aparat.com//video/video/config/videohash/BA9Md/watchtype/embed" allowfullscreen="true" quality="high" name="aparattv_BA9Md" id="aparattv_BA9Md" src="http://host10.aparat.com/public/player/aparattv" type="application/x-shockwave-flash">
using System.Web.Mvc; namespace MvcApplication1 { public static class AparatPlayerHelper { public static MvcHtmlString AparatPlayer(this HtmlHelper helper, string mediafile, int height, int width) { var player = @"<embed height=""{0}"" width=""{1}"" flashvars=""config=http://www.aparat.com//video/video/config/videohash/{2}/watchtype/embed"" allowfullscreen=""true"" quality=""high"" name=""aparattv_{2}"" id=""aparattv_{2}"""" src=""http://host10.aparat.com/public/player/aparattv"" type=""application/x-shockwave-flash"">"; player = string.Format(player, height, width, mediafile); return new MvcHtmlString(player); } } }
@Html.AparatPlayer("BA9Md", 400, 500)
using System; using System.Drawing; using System.Web.Mvc; namespace MvcApplication1 { public static class YouTubePlayerHelper { public static MvcHtmlString YouTubePlayer(this HtmlHelper helper, string playerId, string mediaFile, YouTubePlayerOption youtubePlayerOption) { const string baseURL = "http://www.youtube.com/v/"; // YouTube Embedded Code var player = @"<div id=""YouTubePlayer_{7}""width:{1}px; height:{2}px;""> <object width=""{1}"" height=""{2}""> <param name=""movie"" value=""{6}{0}&fs=1&border={3}&color1={4}&color2={5}""></param> <param name=""allowFullScreen"" value=""true""></param> <embed src=""{6}{0}&fs=1&border={3}&color1={4}&color2={5}"" type = ""application/x-shockwave-flash"" width=""{1}"" height=""{2}"" allowfullscreen=""true""></embed> </object> </div>"; // Replace All The Value player = String.Format(player, mediaFile, youtubePlayerOption.Width, youtubePlayerOption.Height, (youtubePlayerOption.Border ? "1" : "0"), ConvertColorToHexa.ConvertColorToHexaString(youtubePlayerOption.PrimaryColor), ConvertColorToHexa.ConvertColorToHexaString(youtubePlayerOption.SecondaryColor), baseURL, playerId); //Retrun Embedded Code return new MvcHtmlString(player); } } public class YouTubePlayerOption { int _width = 425; int _height = 355; Color _color1 = Color.Black; Color _color2 = Color.Aqua; public YouTubePlayerOption() { Border = false; } public int Width { get { return _width; } set { _width = value; } } public int Height { get { return _height; } set { _height = value; } } public Color PrimaryColor { get { return _color1; } set { _color1 = value; } } public Color SecondaryColor { get { return _color2; } set { _color2 = value; } } public bool Border { get; set; } } public class ConvertColorToHexa { private static readonly char[] HexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; public static string ConvertColorToHexaString(Color color) { var bytes = new byte[3]; bytes[0] = color.R; bytes[1] = color.G; bytes[2] = color.B; var chars = new char[bytes.Length * 2]; for (int i = 0; i < bytes.Length; i++) { int b = bytes[i]; chars[i * 2] = HexDigits[b >> 4]; chars[i * 2 + 1] = HexDigits[b & 0xF]; } return new string(chars); } } }
@Html.YouTubePlayer("Casablanca", "iLdqKUkkM6w", new YouTubePlayerOption() { Border = true })
namespace OpenAPISwaggerDoc.Web.Controllers { [Route("api/[controller]")] [ApiController] public class ConventionTestsController : ControllerBase { // GET: api/ConventionTests/5 [HttpGet("{id}", Name = "Get")] [ApiConventionMethod(typeof(DefaultApiConventions), nameof(DefaultApiConventions.Get))] public string Get(int id) { return "value"; }
using Microsoft.AspNetCore.Mvc.ApiExplorer; namespace Microsoft.AspNetCore.Mvc { public static class DefaultApiConventions { [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)] [ProducesDefaultResponseType] [ProducesResponseType(200)] [ProducesResponseType(404)] public static void Get( [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Suffix)] [ApiConventionTypeMatch(ApiConventionTypeMatchBehavior.Any)] object id); } }
امکان اعمال DefaultApiConventions به تمام متدهای یک کنترلر API نیز به صورت زیر با استفاده از ویژگی ApiConventionType اعمال شدهی به کلاس کنترلر میسر است:
namespace OpenAPISwaggerDoc.Web.Controllers { [Route("api/[controller]")] [ApiController] [ApiConventionType(typeof(DefaultApiConventions))] public class ConventionTestsController : ControllerBase
[assembly: ApiConventionType(typeof(DefaultApiConventions))] namespace OpenAPISwaggerDoc.Web { public class Startup
ایجاد ApiConventions سفارشی
همانطور که عنوان شد، اگر متدهای API شما دقیقا همان نامهای پیشفرض Get/Post/Put/Delete را داشته باشند، توسط DefaultApiConventions مدیریت خواهند شد. در سایر حالات، مثلا اگر بجای نام Post، از نام Insert استفاده شد، باید ApiConventions سفارشی را ایجاد کرد:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; namespace OpenAPISwaggerDoc.Web.AppConventions { public static class CustomConventions { [ProducesDefaultResponseType] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)] public static void Insert( [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Any)] [ApiConventionTypeMatch(ApiConventionTypeMatchBehavior.Any)] object model) { } } }
پس از آن برای اعمال این ApiConventions جدید میتوان به صورت زیر عمل کرد:
namespace OpenAPISwaggerDoc.Web.Controllers { [Route("api/[controller]")] [ApiController] public class ConventionTestsController : ControllerBase { [HttpPost] [ApiConventionMethod(typeof(CustomConventions), nameof(CustomConventions.Insert))] public void Insert([FromBody] string value) { }
سؤال: آیا استفادهی از این ApiConventions ایدهی خوبی است؟
همانطور که در ابتدای بحث نیز عنوان شد، اگر فیلترهای سراسری را مانند قسمت قبل فعال کرده باشیم، از اعمال ApiConventions صرفنظر میشود. همچنین حالت پیشفرض آنها برای حالتهای متداول و ساده مفید هستند و برای سایر حالات باید کدهای زیادی را نوشت. به همین جهت خود مایکروسافت هم استفادهی از ApiConventions را صرفا برای کنترلرهای API ای که دقیقا مطابق با قالب پیشفرض آنها تهیه شدهاند، توصیه میکند. بنابراین استفادهی از Attributes که در قسمت قبل آنها را بررسی کردیم، مقدم هستند بر استفادهی از ApiConventions و تعدادی از بهترین تجربههای کاربری در این زمینه به شرح زیر میباشند:
- از API Analyzers که در قسمت قبل معرفی شد، برای یافتن کمبودهای نقایص مستندات استفاده کنید.
- از ویژگی ProducesDefaultResponseType استفاده کنید؛ اما تا جائیکه میتوانید، جزئیات ممکن را به صورت صریحی مستند نمائید.
- Attributes را به صورت سراسری معرفی کنید.
بهبود مستندات Content negotiation
فرض کنید میخواهید لیست کتابهای یک نویسنده را دریافت کنید. در اینجا خروجی ارائه شده، با فرمت JSON تولید میشود؛ اما ممکن است XML ای نیز باشد و یا حالتهای دیگر، بسته به تنظیمات برنامه. کار Content negotiation این است که مصرف کنندهی یک API، دقیقا مشخص کند، چه نوع فرمت خروجی را مدنظر دارد. هدری که برای این منظور استفاده میشود، accept header نامدارد و ذکر آن اجباری است؛ هر چند تعدادی از APIها بدون وجود آن نیز سعی میکنند حالت پیشفرضی را ارائه دهند.
Swagger-UI به نحوی که در تصویر فوق ملاحظه میکنید، امکان انتخاب Accept header را مسیر میکند. در این حالت اگر application/json را انتخاب کنیم، خروجی JSON ای را دریافت میکنیم. اما اگر text/plain را انتخاب کنیم، چون توسط API ما پشتیبانی نمیشود، خروجی از نوع 406 یا همان Status406NotAcceptable را دریافت خواهیم کرد. بنابراین وجود گزینهی text/plain در اینجا غیرضروری و گمراه کنندهاست و نیاز است این مشکل را برطرف کرد:
namespace OpenAPISwaggerDoc.Web.Controllers { [Produces("application/json")] [Route("api/authors/{authorId}/books")] [ApiController] public class BooksController : ControllerBase
پس از اعمال این ویژگی، تاثیر آنرا بر روی Swagger-UI در شکل زیر مشاهده میکنید که اینبار تنها به یک مورد مشخص، محدود شدهاست:
در اینجا اگر قصد داشته باشیم خروجی XML را نیز پشتیبانی کنیم، میتوان به صورت زیر عمل کرد:
- ابتدا در کلاس Startup، نیاز است OutputFormatter متناظری را به سیستم معرفی نمود:
namespace OpenAPISwaggerDoc.Web { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(setupAction => { setupAction.OutputFormatters.Add(new XmlSerializerOutputFormatter());
namespace OpenAPISwaggerDoc.Web.Controllers { [Produces("application/json", "application/xml")] [Route("api/authors/{authorId}/books")] [ApiController] public class BooksController : ControllerBase
در این حالت اگر Controls Accept header را در UI از نوع xml انتخاب کنیم و سپس با کلیک بر روی دکمهی try it out و ذکر id یک نویسنده، لیست کتابهای او را درخواست کنیم، خروجی نهایی XML ای آن قابل مشاهده خواهد بود:
البته تا اینجا فقط Swagger-UI را جهت محدود کردن به دو نوع خروجی با فرمت JSON و XML، اصلاح کردهایم؛ اما این مورد به معنای محدود کردن سایر ابزارهای آزمایش یک API مانند postman نیست. در این نوع موارد، تمام مدیاتایپهای ارسالی پشتیبانی نشده، سبب تولید خروجی با فرمت JSON میشوند. برای محدود کردن آنها به خروجی از نوع 406 میتوان تنظیم ReturnHttpNotAcceptable را به true انجام داد تا اگر برای مثال درخواست application/xyz ارسال شد، صرفا یک استثناء بازگشت داده شود و نه خروجی JSON:
namespace OpenAPISwaggerDoc.Web { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(setupAction => { setupAction.ReturnHttpNotAcceptable = true; // Status406NotAcceptable
بهبود مستندات نوع بدنهی درخواست
تا اینجا فرمت accept header را دقیقا مشخص و مستند کردیم؛ اما اگر به تصویر فوق دقت کنید، در حین ارسال اطلاعاتی از نوع POST به سرور، چندین نوع Request body را میتوان انتخاب کرد که الزاما تمام آنها توسط API ما پشتیبانی نمیشود. برای رفع این مشکل میتوان از ویژگی Consumes استفاده کرد که نوع مدیتاتایپهای مجاز ورودی را مشخص میکند:
namespace OpenAPISwaggerDoc.Web.Controllers { [Produces("application/json", "application/xml")] [Route("api/authors/{authorId}/books")] [ApiController] public class BooksController : ControllerBase { /// <summary> /// Create a book for a specific author /// </summary> /// <param name="authorId">The id of the book author</param> /// <param name="bookForCreation">The book to create</param> /// <returns>An ActionResult of type Book</returns> [HttpPost()] [Consumes("application/json")] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<ActionResult<Book>> CreateBook( Guid authorId, [FromBody] BookForCreation bookForCreation) {
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید: OpenAPISwaggerDoc-05.zip
21.Visual Studio 2017 15.9 منتشر شد
Issues Fixed in 15.9.21
- Fixed a bug where the .NET Profiling tools couldn't be installed on non-enterprise versions of Visual Studio 2017 when using an offline installer.
- Fixed C++ compiler bug where a static_cast in a decltype would evaluate incorrectly. To minimize disruptions to existing codebases, in VS2017 this fix takes effect when the (newly added) /d1decltypeIdentityConversion switch is thrown.
- New Spectre mitigation options in C++ compiler: /Qspectre-load & /Qspectre-load-cf for speculative load hardening.