نظرات مطالب
شروع کار با Angular Material ۲
این موردی که شما ذکر کردید نحوه استفاده از کامپوننت باتن در انگیولار متریال یک میباشد.
همانطور که در متن نیز اشاره شد، انگیولار متریال 2 کامپوننتهای با کیفیت بالا و کدهای تمیز و مستندات کافی در اختیار توسعه دهندگان قرار میدهد. این مستندات را در اینجا میتوانید مشاهده کنید. بنده نیز از همین مستندات استفاده کردهام.
سلام و با تشکر. میخواستم بدونم چجوری میتوان پسوند آدرس Url رو حذف کنم، نمیدونم تا چه اندازه برای کیفیت سایت مفید هست ولی بیشتر سایتهای که من میبینم این کار رو انجام میدند. من با asp.net form کار میکنم.
نظرات مطالب
(Domain Driven Design) به زبان ساده
عنوان مطلب هست «به زبان ساده»، ولی اصل PI و Specification pattern و مانند اون در مقدمه مطلب بکار رفتن که کمی برای قسمت اول زیاده روی هست. ضمنا Refactoring اصلا به معنای بهبود و توسعه همزمان سیستم نیست. Refactoring بهبود کیفیت کدها هست بدون تغییری در ساختار کلی سیستم.
نظرات مطالب
معرفی کتابخانه PdfReport
ممنون آقای نصیری. من با توجه به مقالات گذشته شما در زمینه iTextSharp یک کتابخانه کوچک برای کارهای خودم تهیه کرده بودم ولی محدودیتها و مشکلات زیادی داشت. با توجه به اینکه کیفیت pdfهای سایت شما به نظرم خیلی خوب هستن تصمیم داشتم از شما درباره نحوه ساخت اونها سوال کنم که خودتون زحمتشو کشیدید. قصد دارم با اجازه شما این کتابخانه را جایگزین کنم. باز هم از شما ممنونم
نظرات مطالب
آشنایی با Fluent interfaces
سلام
به نظر من این امکانات فقط برای پروژههای مانند LINQ خوبه و واقعا در محیطهای واقعی قابل پیاده سازی نیست.
چون این کار خودش نیاز به تحلیل جدا داره ... و پیاده ساز ی اون هم وقت گیره.
مگر در مواردی که قرار لایه بندی برنامه در بالاترین صطح و کیفیت قرار داشته باشه ، که باز هم بعید میدونم در این حد نیاز باشه.
نظرات نظرسنجیها
کدامیک از سرویس دهندههای ابری زیر را پیشنهاد میکنید
بله به پیشنهاد دوستان ما چندین ماهه از لیارا برای production استفاده میکنیم و راضی هستیم.
مستندات کوتاه و کاربردی دارن، کلا UX عالی و کار باهاش خیلی راحت. امکانات خیلی خوبی هم ارائه میکنن.
از لحاظ آپتایم عالی بوده، یادم نمیاد قطعی داشته باشیم. سرعت و کیفیت پاسخگویی پشتیبانی هم خوب بوده.
نظرات نظرسنجیها
آیا برای پروژههای خود تست مینویسید؟
دقیقا . کلی و جامع همه چیز مربوط به تست رو گفتید. یه مورد هم من اضافه کنم . همانطوری که به کیفیت پروژه و پیش بینی آینده پروژه و تغییراتی که خواهیم داشت فکر میکنیم باید برای تست کردن آن هم به همان اندازه وقت بزاریم (البته بایدی وجود نداره) و اینکه یه تیم جداگانه باشه برا تست فقط
نظرات نظرسنجیها
از چند مانیتور برای برنامه نویسی استفاده میکنید؟
من یک Monitor که 24 اینچ Asus هستش استفاده میکنم. هم به لحاظ کیفیت راضی هستم و هم میتونم دوتا پنجره رو همزمان کنار هم بذارم. مثلا VisualStudio و یک Browser. البته تصمیم دارم که یک Monitor دیگه هم اضافه کنم.
خوب شد نظر دوستان رو مطالعه کردم تا برای خرید بعدی، به سایز و وضوح Monitor حتما دقت کنم که با اینی که دارم یکی باشه.
تا اینجا با کمک توابع توانستیم PowerShell را به اصطلاح extend کنیم. نوع دیگر دستورات، command letها هستند. این نوع دستورات را با کمک یک زبان داتنتی میتوانیم ایجاد کنیم. به این نوع دستورات complied cmdlet گفته میشود. در بیشتر مواقع با کمک advanced functionها میتوانید بیشتر کارها را انجام دهید؛ چراکه به صورت مستقیم امکان استفاده از داتنت را درون PowerShell دارید. اما شاید ترجیح دهید از سیشارپ یا دیگر زبانها داتنتی برای ایجاد یک تابع استفاده کنید.
نحوهی ایجاد یک cmdlet با کمک #C
ابتدا یک دایرکتوری جدید را ایجاد کرده و درون آن یک پروژهی از نوع class library را ایجاد کنید. سپس پکیج PowerShellStandard.Library را درون پروژه ایجاد شده با کمک dotnet cli به پروژه اضافه کنید:
mkdir ps_cmdlet_with_csharp && cd "$_" dotnet new classlib dotnet add package PowerShellStandard.Library mv Class1.cs GetHelloCommand.cs
namespace ps_cmdlet_with_csharp; using System.Management.Automation; [Cmdlet(VerbsCommon.Get, "Hello")] public class GetHelloCommand : PSCmdlet { [Parameter(Mandatory = true, Position = 0, ValueFromPipeline = true)] public string Name { get; set; } protected override void BeginProcessing() { WriteObject("Start processing"); } protected override void ProcessRecord() { WriteObject("Hello " + Name); } protected override void EndProcessing() { WriteObject("End processing"); } }
using System.Collections.ObjectModel; using System.Management.Automation.Host; namespace System.Management.Automation { public abstract class PSCmdlet : Cmdlet { protected PSCmdlet(); public PSEventManager Events { get; } public PSHost Host { get; } public CommandInvocationIntrinsics InvokeCommand { get; } public ProviderIntrinsics InvokeProvider { get; } public JobManager JobManager { get; } public JobRepository JobRepository { get; } public InvocationInfo MyInvocation { get; } public PagingParameters PagingParameters { get; } public string ParameterSetName { get; } public SessionState SessionState { get; } public PathInfo CurrentProviderLocation(string providerId); public Collection<string> GetResolvedProviderPathFromPSPath(string path, out ProviderInfo provider); public string GetUnresolvedProviderPathFromPSPath(string path); public object GetVariableValue(string name); public object GetVariableValue(string name, object defaultValue); } }
PS /> dotnet build PS /> Import-Module ./bin/Debug/net7.0/ps_cmdlet_with_csharp.dll
PS /> Get-Command -Module ps_cmdlet_with_csharp CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Hello 1.0.0.0 ps_cmdlet_with_csharp
namespace ps_cmdlet_with_csharp; using System.Management.Automation; [Cmdlet(VerbsCommon.Get, "Hello")] public class GetHelloCommand : PSCmdlet { // as before } [Cmdlet(VerbsCommon.Get, "Greetings")] public class GetGreetingsCommand : PSCmdlet { [Parameter(Mandatory = true, Position = 0, ValueFromPipeline = true)] public string Name { get; set; } protected override void BeginProcessing() { WriteObject("Start processing"); } protected override void ProcessRecord() { WriteObject("Greetings " + Name); } protected override void EndProcessing() { WriteObject("End processing"); } }
Import-Module: Invalid assembly public key.
<Project Sdk="Microsoft.NET.Sdk"> <!-- other tags --> <ItemGroup> <Compile Include="./GetHelloCommand.cs" /> </ItemGroup> </Project>
PS /> Get-Command -Module ps_cmdlet_with_csharp CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Greetings 1.0.0.0 ps_cmdlet_with_csharp Cmdlet Get-Hello 1.0.0.0 ps_cmdlet_with_csharp
یک مثال تکمیلی
درون یک کلاس Cmdlet، امکان استفاده از تمامی annotationهایی را که در قسمت قبل بررسی کردیم، اینجا نیز در اختیار داریم؛ بنابراین نیاز به توضیح مجدد آن نیست. در ادامه میخواهیم یک دستور را با عنوان Push-SlackMessage تهیه کنیم که کار ارسال یک پیام را به یک کانال Slack، انجام میدهد:
namespace ps_cmdlet_with_csharp; using System.Management.Automation; using System.Net.Http.Headers; [Cmdlet(VerbsCommon.Push, "SlackMessage")] [Alias("ssm")] [OutputType(typeof(string))] public class SlackMessageCommand : PSCmdlet { [Parameter(Mandatory = true)] [Alias("m")] public string Message { get; set; } [Parameter(Mandatory = true)] [Alias("t")] [ValidatePattern(@"xoxp-[0-9]{11}-[0-9]{12}-[0-9]{13}-[0-9a-zA-Z]{32}")] public string Token { get; set; } [Parameter(Mandatory = true)] [Alias("cid")] public string ChannelID { get; set; } protected async override void ProcessRecord() { base.ProcessRecord(); try { using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.Token); var values = new Dictionary<string, string> { { "channel", this.ChannelID }, { "text", this.Message } }; var content = new FormUrlEncodedContent(values); var response = await client.PostAsync("https://slack.com/api/chat.postMessage", content); var responseString = await response.Content.ReadAsStringAsync(); WriteObject("Message sent"); } catch (Exception ex) { WriteObject(ex.Message); } } }
یک نکته در مورد ایمپورت کردن ماژولها
دستوراتی که تاکنون ایجاد کردیم (هم توابع و هم compiled cmletها) برای اجرا باید یکبار درون حافظه قرار بگیرند و سپس امکان اجرای آنها را خواهیم داشت. دلیل آن نیز این است که همه چیز درون سشن جاری انجام خواهد شد و به محض بستن آن، تغییرات نیز ار حافظه خارج خواهند شد. یعنی برای command letی که ایجاد کردیم، با هربار باز کردن یک سشن جدید مجبور خواهیم بود که مجدداً آن را ایمپورت کنیم. برای رفع این مشکل میتوانیم از پروفایلها استفاده کنیم. توسط پروفایل، امکان سفارشیسازی شل را خواهیم داشت. پروفایل در واقع یک اسکریپت PowerShell است که به محض اجرای PowerShell فراخوانی خواهد شد. بنابراین درون پروفایل این فرصت را خواهیم داشت تا متغیرها، ماژولها، aliaseها و… را قبل از باز کردن شل، درون سشن PowerShell بارگذاری کنیم. PowerShell از چندین نوع پروفایل پشتیبانی میکند و توسط متغیر خودکار PROFILE$ میتوانیم لیست مسیرهای پروفایلها را مشاهده کنیم:
PS /> $PROFILE | Get-Member -Type NoteProperty | Select-Object Name, Definitionbject Name, Definition Name Definition ---- ---------- AllUsersAllHosts string AllUsersAllHosts=/usr/local/microsoft/powershell/7/… AllUsersCurrentHost string AllUsersCurrentHost=/usr/local/microsoft/powershell… CurrentUserAllHosts string CurrentUserAllHosts=/Users/sirwanafifi/.config/powe… CurrentUserCurrentHost string CurrentUserCurrentHost=/Users/sirwanafifi/.config/p…
$SlackProjectPath = "/Users/sirwanafifi/Desktop/ps_cmdlet_with_csharp/bin/Debug/net7.0/ps_cmdlet_with_csharp.dll" Import-Module $SlackProjectPath
PS /> Get-Command -Module ps_cmdlet_with_csharp CommandType Name Version Source ----------- ---- ------- ---- Cmdlet Push-SlackMessage 1.0.0.0 ps_…