<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آرام رحماني</title>
        <link>https://virgool.io/feed/@aramrahmani</link>
        <description>Net Developer.</description>
        <language>fa</language>
        <pubDate>2026-04-15 09:03:47</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/653780/avatar/Xqwucl.png?height=120&amp;width=120</url>
            <title>آرام رحماني</title>
            <link>https://virgool.io/@aramrahmani</link>
        </image>

                    <item>
                <title>روزگار بیگانه</title>
                <link>https://virgool.io/@aramrahmani/%D8%B1%D9%88%D8%B2%DA%AF%D8%A7%D8%B1-%D8%A8%DB%8C%DA%AF%D8%A7%D9%86%D9%87-fvr6wu3b1cqu</link>
                <description>این روزها ایران شبیه شهری‌ست که انگار یک‌جور مهِ نامرئی رویش نشسته؛ نه آن‌قدر غلیظ که راهت را گم کنی، نه آن‌قدر کم‌رنگ که همه‌چیز واضح باشد. از آن مه‌هایی که وقتی قدم می‌زنی، حس می‌کنی جهان بی‌صدا تو را نگاه می‌کند، درست مثل نگاه مورسو در «بیگانه» — خونسرد، دقیق، و یک‌جورهایی مظنون.صبح‌ها که چشم باز می‌کنی، هنوز قبل از این‌که از تخت بیرون بیایی، یک لحظه فکر می‌کنی امروز قرار است چه حسی داشته باشی؟ آرام؟ گیج؟ امیدوار؟ یا فقط مثل یک تماشاگر حرفه‌ای، نشسته روی صندلی ردیف آخر، که دنیا جلویش صحنه عوض می‌کند و او فقط پلک می‌زند.تو خیابان، همه‌چیز انگار یک درجه عجیب‌تر است: عابرها با ریتم‌های نامنظم، موتوری‌ها با منطق‌های ناشناخته، و مغازه‌دارها که انگار وسط یک سریال طولانی گیر کرده‌اند. اما وسط همین شلوغی، یک لحظه ممکن است نور آفتاب بخورد به شیشه یک ماشین و تو را پرت کند به همان حسِ معروف کامویی: حسِ این‌که دنیا دارد ادامه می‌دهد، بی‌آن‌که بپرسد حال تو خوب است یا نه.جذابش همین‌جاست؛ این روزها هرکدام از ما یک «مورسو» کوچولو درون‌مان داریم. یک بخشی که فقط می‌خواهد تماشا کند، ثبت کند، بفهمد چرا همه‌چیز این‌قدر واقعی و این‌قدر نامعمول است. بخشی که وسط شلوغی، ناگهان مکث می‌کند و فکر می‌کند: «واقعاً من این‌جا چه می‌کنم؟» و بعد همان لحظه، یک بوق وحشی یا یک پیام عجیب همه‌چیز را از فلسفه می‌کَند و پرت می‌کند توی زندگی واقعی.اما شاید همین تضاد است که این روزها را جذاب می‌کند؛ این‌که زندگی دارد با ما شوخی می‌کند، گاهی بی‌رحمانه، گاهی بامزه، اما همیشه واقعی. و ما با تمام خستگی‌ها و سؤال‌ها — باز از نو برمی‌خیزیم، چای‌مان را هم می‌زنیم، از خانه می‌زنیم بیرون، و با یک لبخند کوتاه به خودمان می‌گوییم: «باشد… ببینیم امروز چه صحنه‌ای برایمان نوشته‌اند.»</description>
                <category>آرام رحماني</category>
                <author>آرام رحماني</author>
                <pubDate>Thu, 09 Apr 2026 11:51:26 +0330</pubDate>
            </item>
                    <item>
                <title>Options Pattern In Dot Net</title>
                <link>https://virgool.io/@aramrahmani/options-pattern-in-dot-net-aek25vmi99mc</link>
                <description>Configuration الگوی Options این امکان را فراهم می‌کند که به تمام تنظیمات پیکربندی خود، معمولاً از فایل appsettings.json، به‌صورت strongly typed در زمان اجرا دسترسی داشته باشید.الگوی Options رویکردی ساختاریافته‌تر ارائه می‌دهد و قابلیت‌هایی مانند اعتبارسنجی، بارگذاری مجدد زنده (Live Reloading) و آزمایش آسان‌تر را فراهم می‌کند.خب توی این بخش می خوام بصورت خیلی ساده توضیح بدم که  تنظیمات مرتبط با یک برنامه رو چطوری ایجاد کنیم و نحوه استفاده و همچنین نحوه بروز رسانی این تنظیمات رو بصورت real time انجام بدیم.در صورتی که بخواهیم تنظیمات را بدون راه‌اندازی مجدد برنامه به‌روزرسانی کنیم، می‌توانیم از IOptionsSnapshot&lt;T&gt; یا IOptionsMonitor&lt;T&gt; بسته به شرایط استفاده کنیم.گام اول : ایجاد کلاسی برای استفاده و نمایش فایل تنظیمات مورد نیاز برنامه. برای مثال من می خوام تنظیمات مرتبط با سرویس نقشه استفاده شده در اپلیکشن خودم رو با نام MapOptions استفاده کنم.کلاس MapOptionsگام دوم : اضافه کردن section تنظیمات به فایل appsettings.json موجود در پروژه . در این مثال من setting مرتبط با نقشه رو به فایل خودم اضافه می کنم.configFileگام سوم : Bind کردن Configuration Section به کلاس تعریف شده می باشد، اینکار باید داخل فایل program.cs پروژه انجام شود.bind sectionداخل کنترلر با Inject کردن IOptions&lt;MapOptions&gt;c میتوان از این تنظیمات استفاده کرد.controllerاستفاده از IOptionsSnapshot:اگر بخواهیم PORT و Key را تغییر دهیم، باید برنامه را مجدد راه‌اندازی کنیم تا تغییرات اعمال شوند، زیرا IOptions&lt;T&gt; از بارگذاری مجدد زنده (Live Reloading) پشتیبانی نمی‌کند.اما یک گزینه بهتر به نام IOptionsSnapshot وجود دارد.سرویس IOptionsSnapshot به‌عنوان یک Scoped ثبت می‌شود و مقدار تنظیمات را فقط در طول عمر یک درخواست نگه می‌دارد.بنابراین، فقط باید آن را با وابستگی‌های Scoped و Transient استفاده کنیم و نمی‌توانیم آن را داخل سرویس‌های Singleton تزریق کنیم!استفاده از IOptionsSnapshot برای خواندن تنظیمات به‌روزرسانی‌شدهsnapshotاستفاده از IOptionsMonitor:سرویس IOptionsMonitor به‌عنوان یک Singleton ثبت می‌شود.بنابراین، اگر سرویس شما Singleton است، باید از IOptionsMonitor استفاده کنید.همچنین، اگر می‌خواهید مقادیر پیکربندی بلافاصله در دسترس باشند، IOptionsMonitor گزینه مناسبی است.سرویسIOptionsSnapshot را نمی‌توان در سرویس‌های Singleton تزریق کرد، در غیر این صورت باعث خطا خواهد شد.استفاده از IOptionsMonitor برای خواندن تنظیمات به‌روزرسانی‌شدهIOptionsMonitor سرویسIOptionsMonitor به‌جای Value از CurrentValue برای دریافت مقادیر پیکربندی استفاده می‌کند........................مقایسه IOptions، IOptionsSnapshot و IOptionsMonitor✅ IOptions:به‌عنوان Singleton ثبت می‌شود.از بارگذاری مجدد تنظیمات پشتیبانی نمی‌کند.مقادیر ثابت هستند و تا زمان راه‌اندازی مجدد برنامه تغییر نمی‌کنند.از گزینه‌های نام‌گذاری‌شده (Named Options) پشتیبانی می‌کند.✅ IOptionsSnapshot:به‌عنوان Scoped ثبت می‌شود.از بارگذاری مجدد تنظیمات پشتیبانی می‌کند.مقادیر در هر درخواست جدید، به‌روز می‌شوند.از گزینه‌های نام‌گذاری‌شده (Named Options) پشتیبانی می‌کند.✅ IOptionsMonitor:به‌عنوان Singleton ثبت می‌شود.از بارگذاری مجدد تنظیمات پشتیبانی می‌کند.مقادیر کش (Cache) شده و بلافاصله پس از تغییر، به‌روز می‌شوند.از گزینه‌های نام‌گذاری‌شده (Named Options) پشتیبانی می‌کند.</description>
                <category>آرام رحماني</category>
                <author>آرام رحماني</author>
                <pubDate>Fri, 07 Feb 2025 16:32:05 +0330</pubDate>
            </item>
                    <item>
                <title>deprecated Method In (C#)</title>
                <link>https://virgool.io/@aramrahmani/deprecated-method-ecjpievlnb0l</link>
                <description> deprecated Method APIمنسوخ شدن كد فرآيند روتينی است كه از زمانی كه برنامه نويس شروع به توسعه و پياده سازی كد می كند شروع می شود تا زمانی كه مجبور به deprecate كردن بخشی از كد می شود. اگر كد ما به صورت Internal باشد كه راحت اقدام به حذف يا تغيير آن مي كنيم. مشكل زمانی نمايان می شود كه كد ما به صورت external  در اختيار تعدادی استفاده كننده می باشد همانند متدهای موجود در يك API  كه در اختيار تعداد زيادی كاربر استفاده كننده می باشد ، در همچين شرايطی با حذف يك يا چند متد بدون اطلاع رسانی قبلی ممكن است فرآيند دچار اختلال اساسی شود كه گاهی جهت برگشت به شرايط stable  بايد هزينه زيادی را متحمل شويم.يكی از راه های پيشنهادی جهت depricate كردن يك متد استفاده از Attribute به  اسم [Obsolete] می باشد .زمانی كه تصميم به depricate كردن كد گرفتيم در اولين ورژن جديد مي توانيم به كابران استفاده كننده اعلام كنيم كه متد مورد استفاده بزودی از دسترس خارج می شود و با يك warning استفاده كننده را مطلع كنيم.[Obsolete(&quot;This method will be unavailable soon &quot;)]Public String PrintFullName( ) =&gt; $ &quot; Aram Rahmani &quot; ;همچنين شما می توانيد سطح Warning  را به Error  تغيير دهيد و مانع استفاده از متد مورد نظر شويد.[Obsolete(&quot; This method will be unavailable soon &quot; ,  true )]Public String PrintFullName( ) =&gt;$ &quot; Aram Rahmani &quot;</description>
                <category>آرام رحماني</category>
                <author>آرام رحماني</author>
                <pubDate>Sun, 20 Nov 2022 09:51:45 +0330</pubDate>
            </item>
                    <item>
                <title>ویژگی های جدید در C# 11</title>
                <link>https://virgool.io/@aramrahmani/c-11-features-ryic7nrrwj3l</link>
                <description>C# 11 فهرست مطالبRequired MembersRaw String LiteralsUTF-8 String LiteralsList PatternsNewlines in String Interpolation ExpressionsAuto-default StructsPattern Match Span&lt;char&gt; on a Constant StringGeneric AttributesExtended nameof ScopeAn Unsigned Right-shift OperatorStatic Abstract Members in InterfacesGeneric MathRequired Membersدر C# 11  یک ویژگی جدید به نام  Required بعد از سطح دسترسی به فیلد ها و پراپرتی ها اضافه شده است که با استفاده از آن می توانید سازنده ها و کسانی که از آن شی نمونه سازی می کنند را وادار به مقدار دهی اولیه کنید.public class Person{    public Guid Id { get; set; } = Guid.NewGuid();    public required string FirstName { get; set; }    public required string LastName { get; set; }}// Initializations with required properties - validvar p1 = new Person { FirstName = &quot;Aram&quot;, LastName = &quot;Rahmani&quot; };Person p2 = new(&quot;Aram&quot;, &quot;Rahmani&quot;);// Initializations with missing required properties - compilation errorvar p3 = new Person { FirstName = &quot;Aram&quot; };Person p4 = new();اگر می خواهید چندین پارامتر را در سازنده اجباری کنید کافی است که صفتSetsRequiredMembersرا به سازنده اضافه کنید.public class Person{    public Person() { }    [SetsRequiredMembers]    public Person(string firstName , string lastName )    {        FirstName = firstName ;        LastName = lastName ;    }    public Guid Id { get; set; } = Guid.NewGuid();    public required string FirstName { get; set; }    public required string LastName { get; set; }} Raw String Literalsدر C# 11  ویژگی جدیدی نظیر string interpolation که در نسخه های قبل منتشر شد اضافه شده است که به شما امکان می دهد تا رشته های حاوی متن دلخواه بدون از دست رفتن ترکیب کنید. (ترجمه دقیق این ویژگی لفظ رشته ای خام)این ویژگی جدید از سه دابل کوتیشن تشکیل شده است &quot;&quot;&quot;...&quot;&quot;&quot;  اگر متن شما شامل 3 تا دابل کوتیشن باشد جهت استفاده از این فرمت شما باید از چهار دابل کوتیشن استفاده کنید.در مثال زیر ما چون از فرمت رشته ای Json  استفاده کرده ایم و فرمت json شامل { } می باشد جهت جلوگیری از تداخل با فرمت String Interpolation  ما از دو علامت $$  استفاده کرده ایم و جهت استفاده از {} دوتایی از {{ }} استفاده کرده ایم.string firstName= &quot;Aram&quot;, lastName= &quot;Rahmani&quot;string jsonString =     $$&quot;&quot;&quot;    {        &quot;FirstName&quot;: {{firstName}},        &quot;LastName&quot;: {{lastName}}    }    &quot;&quot;&quot;Console.WriteLine(jsonString);UTF-8 String Literalsسی شارپ 11 رشته های UTF-8 را معرفی کرده است که اجازه می دهد تنها کاراکتر های UTF-8 به نمایش بایت آن ها تبدیل کنید.این تبدیل در زمان کامپایل انجام می شود.// C# 10byte[] array = Encoding.UTF8.GetBytes(&quot;Hello World&quot;);// C# 11byte[] array = &quot;Hello World&quot;List Patternsدر C# 11 الگوهای لیست را معرفی شده است .این تطبیق الگو را برای مطابقت با توالی عناصر در یک آرایه یا یک لیست استفاده می شود.شما می توانید از الگوهای لیست با هر الگوی، از جمله الگوهای ثابت، نوع، ویژگی و رابطه ای استفاده کنید.var numbers = new[] { 1, 2, 3, 4 };// List and constant patternsConsole.WriteLine(numbers is [1, 2, 3, 4]); // TrueConsole.WriteLine(numbers is [1, 2, 4]);    // False// List and discard patternsConsole.WriteLine(numbers is [_, 2, _, 4]); // TrueConsole.WriteLine(numbers is [.., 3, _]);   // True// List and logical patternsConsole.WriteLine(numbers is [_, &gt;= 2, _, _]); // TrueNewlines in String Interpolation Expressionsدر C# 11 امکان رفتن به خط جدید در فرمت String InterPolation  اضافه شده است. این امکان به شما کمک می کند تا کد های C#  و خطوط جدید داخل { } خوانایی و فرمت بهتری داشته باشند.هنگام استفاده از عبارات C# طولانی تر در داخل String InterPolitaion، مانند عبارات سوئیچ تطبیق الگو یا پرس و جوهای LINQ، مفید است.// switch expression in string interpolationint month = 5;string season = $&quot;The season is {month switch{    1 or 2 or 12 =&gt; &quot;winter&quot;,    &gt; 2 and &lt; 6 =&gt; &quot;spring&quot;,    &gt; 5 and &lt; 9 =&gt; &quot;summer&quot;,    &gt; 8 and &lt; 12 =&gt; &quot;autumn&quot;,    _ =&gt; &quot;unknown. Wrong month number&quot;,}}.&quot;Console.WriteLine(season);// The season is spring.// LINQ query in string interpolationint[] numbers = new int[] { 1, 2, 3, 4, 5, 6 };string message = $&quot;The reversed even values of {nameof(numbers)} are {string.Join(&quot;, &quot;, numbers.Where(n =&gt; n % 2 == 0)                             .Reverse())}.&quot;Console.WriteLine(message);// The reversed even values of numbers are 6, 4, 2.Auto-default Structsکامپایلر C# 11 به طور خودکار هر فیلد یا ویژگی را که توسط سازنده در ساختارها مقداردهی نشده است، مقداردهی اولیه می کند.struct Person{    public Person(string name)    {        Name = name;    }    public string Name { get; set; }    public int Age { get; set; }}Pattern Match Span&lt;char&gt; on a Constant Stringبا استفاده از تطبیق الگو، می توانید آزمایش کنید که آیا رشته دارای مقدار ثابت خاصی در سی شارپ است یا خیر.C# 11 امکان تطبیق الگوی Span&lt;char&gt; و ReadOnlySpan&lt;char&gt; را در یک رشته ثابت می دهد.ReadOnlySpan&lt;char&gt; str = &quot;Oleg&quot;.AsSpan();if (str is &quot;Oleg&quot;){    Console.WriteLine(&quot;Hey, Oleg&quot;);}Generic Attributesدر سی شارپ، اگر می خواهید نوع را به یک Propertyمنتقل کنید، می توانید از عبارت typeof استفاده کنید.با این حال، هرچند هیچ راهی برای محدود کردن انواعی که مجاز به استفاده هستید وجود ندارد. سی شارپ 11 اجازه استفاده از Generic Attributes را می دهد.class MyType { }class GenericAttribute&lt;T&gt; : Attribute    where T: MyType {    private T _type;}[Generic&lt;MyType&gt;]class MyClass { }Extended nameof Scopeمی توانید نام یک پارامتر متد را در یک ویژگی در اعلان متد یا پارامتر مشخص کنید.این ویژگی را می توان در افزودن ویژگی ها برای تجزیه و تحلیل کد استفاده کرد.public class MyAttr : Attribute{    private readonly string _paramName;    public MyAttr(string paramName)    {        _paramName = paramName;    }}public class MyClass{    [MyAttr(nameof(param))]    public void Method(int param, [MyAttr(nameof(param))] int anotherParam)    { }}An Unsigned Right-shift Operatorدر C# 11 یک عملگر بدون علامت شیفت به سمت راست &lt;&lt;&lt; معرفی شده است.این عملگر بیت ها هرکدام به سمت راست شیفت می دهد بدون اینکه با ارزش ترین بیت یا همان بیت علامت عوض شود.int n = -32;Console.WriteLine($&quot;Before shift: bin = {Convert.ToString(n, 2),32}, dec = {n}&quot;);int a = n &gt;&gt; 2;Console.WriteLine($&quot;After     &gt;&gt;: bin = {Convert.ToString(a, 2),32}, dec = {a}&quot;);int b = n &gt;&gt;&gt; 2;Console.WriteLine($&quot;After    &gt;&gt;&gt;: bin = {Convert.ToString(b, 2),32}, dec = {b}&quot;);// Output:// Before shift: bin = 11111111111111111111111111100000, dec = -32// After     &gt;&gt;: bin = 11111111111111111111111111111000, dec = -8// After    &gt;&gt;&gt;: bin =   111111111111111111111111111000, dec = 1073741816Static Abstract Members in Interfacesدر C# 11 اعضای انتزاعی ایستا را در رابط ها معرفی می کند.می توانید اعضای انتزاعی ایستا را در واسط ها اضافه کنید تا رابط هایی را تعریف کنید که شامل عملگرهای قابل بارگذاری، سایر اعضای استاتیک و ویژگی های استاتیک می شود.public interface IAdditionOperator&lt;TSelf, TOther, TResult&gt;    where TSelf : IAdditionOperator&lt;TSelf, TOther, TResult&gt;{    static abstract TResult operator +(TSelf left, TOther right);}Generic Mathویژگی اعضای انتزاعی ایستا برای فعال کردن پشتیبانی ریاضی عمومی اضافه شده است.source code</description>
                <category>آرام رحماني</category>
                <author>آرام رحماني</author>
                <pubDate>Thu, 10 Nov 2022 00:12:36 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش تنظیم ssh-key برای گیت</title>
                <link>https://virgool.io/@aramrahmani/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AA%D9%86%D8%B8%DB%8C%D9%85-ssh-key-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%AF%DB%8C%D8%AA-frbvyidqnbmz</link>
                <description>ssh-keyگیت یک نرم‌افزار اوپن سورس است که در سال 2005 از سوی لینوس تروالدز ایجاد  شده است. این ابزار یک «سیستم کنترل نسخه» (Version Control System) است  که در ابتدا برای هماهنگ کار چند توسعه‌دهنده روی کرنل لینوکس ساخته شده  بود. سیستم‌های کنترل نسخه زیادی مانند CVS ،SVN ،Mercurial و غیره وجود  دارند، اما گیت امروزه به یک نرم‌افزار استاندارد برای کنترل نسخه تبدیل  شده است.برای شروع استفاده از Git باید بدانید که کجا می‌توانید ریپازیتوری‌های خود را میزبانی کنید. پلتفرم‌های میزبانی زیادی وجود دارند که می‌توانید کد خود را به طور رایگان روی آن‌ها میزبانی کنید. برخی  گزینه‌ها رایگان نیستند، اما شما به جز در موارد خاص، به اغلب آن‌ها نیازی  نخواهید داشت.در ادامه سه مورد از محبوب‌ترین سرویس‌های میزبانی گیت را ملاحظه می‌کنید:گیت‌هاب ( GitHub): در سال 2008 راه‌اندازی شده و اخیراً از سوی مایکروسافت خریداری شده است. در پاییز 1397 حدود 31 میلیون کاربر داشته است.گیت‌لب (GitLab): در سال 2011 راه‌اندازی شده و تحت مالکیت شرکت GitLab است.بیت‌باکت ( BitBucket): در ژوئن 2008 راه‌اندازی شده است و تحت مالکیت شرکت نرم‌افزاری Atlassian قرار دارد.نکته: پلتفرم‌های میزبانی به دو روش در دسترس هستند که یکی روش کلود  (میزبانی آنلاین) و دیگری میزبانی مستقل روی سرور شخصی (میزبانی خصوصی)  است. برای  انجام هر عملیاتی روی ریپازیتوری های آنلاین(remote) مثل عملیات push یا pull، باید نام کاربری  و کلمه‌ی عبور خود را وارد کنید که تکرار این موضوع شاید در طولانی مدت آزار دهنده باشد.در این آموزش قصد داریم روشی را معرفی کنیم که در آن  دیگر نیازی به هر بار وارد کردن نام کاربری و کلمه‌ی عبور نیست. برای انجام  این کار، از ssh-key استفاده می‌کنیم. ssh key ها ابزاری برای اتصال امن  از طریق بستر ssh به یک ریموت سرور می‌باشند و دو طرف از طریق آن احراز  هویت می‌شوند. جهت استفاده از قابلیت های گیت نیاز است که ابزار Git  را روی سیستم خودمان نصب کنیم.  https://git-scm.com/download/win بعد از نصب Git از طریق لینک بالا نیاز است که یک ریپازیتوری local  ایجاد کنیم. برای اینکار Git Bash را اجرا کنید و به مسیر مورد نظر جهت ساخت ریپازیتوری می رویم و با دستورات زیر یک ریپازیتوری ایجاد می کنیم.mkdir sshKeySetup
cd sshKeySetup
git init
git config --global user.userName yourUserName
git config --global user.email yourEmailمرحله بعدی ایجاد ریپازیتوری روی سرور گیت می باشد که ما در این آموزش GitHub را انتخاب کرده ایم.ابتدا به وب سایت GitHub مراجعه کنید یک حساب کاربری ایجاد کنید و سپس وارد حساب کاربری خود شوید .your repositoriesاز بخش Your repositories یک ریپازیتوری جدید ایجاد می کنیم.create repositoryتنظیمات سطح دسترسی و... بر اساس نیاز خودتون تنظیم کنید و ریپازیتوری را ایجاد کنید.پس از ایجاد ریپازیتوری کافی است که لینک ssh مربوط به ریپازیتوری را کپی کنید و در ریپازیتوری local بعنوان remote تنظیم کنید.ssh-linkبعد از کپی کردن لینک ssh به مسیر ریپازیتوری local بر می گردیم و لینک remote سرور را جهت push , pop تنظیم می کنیم.cd sshKeySetup
git remote add origin git@github.com:aramrahmani/sshKeySetup.gitتا اینجای آموزش یک ریپازیتوری local  ایجاد کردیم و به یک سرور آنلاین گیت هاب وصل کردیم. در ادامه کافی است که یک جفت کلید خصوصی و عمومی را روی سیستم خودمان ایجاد کنیم. کلید خصوصی را روی سیستم خودمان تنظیم می کنیم و کلید عمومی رو سرور گیت هاب تنظیم می کنیم.برای ایجاد ssh-key باید پکیج ssh  روی سیستم ما نصب باشد زمان نصب Git Bash این پکیج به صورت خودکار نصب می شود.(جهت اطمینان از نصب این پکیج کافی است که دستور ssh را در محیط cmd  تایپ کنید.sshssh  برای ایجاد کلید های خصوصی و عمومی می توانید از دستور زیر استفاده کنید.ssh-KeyGenپس از اجرای دستور فوق، در آدرس ~/.ssh ، دو فایل id_rsa و id_rsa.pub ساخته می‌شوند که به ترتیب کلید خصوصی(private key) و کلید عمومی(public key) شما می‌باشند.ssh-keyگام بعدی کلید عمومی را با یک ادیتور باز کنید و محتوای آن را کپی کنید تا در سرور گیت هاب اضافه کنیم.به سایت گیت هاب برگردید وارد حساب کاربری خود شوید از بخش حساب کاربری وارد بخش تنظیمات شوید و از منو سمت چپ گزینه SSH and GPG Keys را انتخاب کنید.new ssh Keycreate newPublic Keyگام بعدی باید کلید خصوصی رو روی سیستم خودمون تنظیم کنیم . برای این کار به محیط Git Bashبروید و دستورات زیر را اجرا کنید.eval $&amp;quot(ssh-agent )&amp;quot
 ssh-add /Users/you/.ssh/id_rsaاگر با پیغام زیر مواجه شدید یعنی تنظیمات به درستی انجام شده است.$ ssh-add id_rsaIdentity added: id_rsa در نهایت جهت تست یک فایل متنی از طریق ریپازیتوری local به سرور آنلاین push می کنیم. برای این کار یک فایل متنی با نام test.txt در ریپازیتوری local  ایجاد می کنیم و با استفاده از دستورات زیر فایل را push می کنیم.git add test.txt
git commit test.txt -m &amp;quotadd test.txt&amp;quot
git push origin masterاگر پس از اجرای دستور push با خطای زیر مواجه شدید:errorبا استفاده از دستور زیر این خطا را رفع کنید و مجددا push کنید.ssh-keyscan github.com &gt;&gt; ~/.ssh/known_hosts
git push origin masterبا مراجعه به سایت گیت هاب و ریپازیتوری ساخته شده مشاهده می کنید که فایل test.txt ایجاد شده است.add test.txtدر این مقاله سعی شد تنظیم ssh-key برای گیت به صورت ساده و پایه آموزش داده شود امیدوارم مفید واقع بشه.</description>
                <category>آرام رحماني</category>
                <author>آرام رحماني</author>
                <pubDate>Fri, 08 Apr 2022 19:32:54 +0430</pubDate>
            </item>
            </channel>
</rss>