<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آرمان</title>
        <link>https://virgool.io/feed/@espiar</link>
        <description>یک برنامه نویس که هرآنچه را که یاد میگیرد در دفترچه یادداشت ویرگولیش یادداشت میکرد(!) حتی یک خط ! تا درصورت نیاز به آن رجوع کند...</description>
        <language>fa</language>
        <pubDate>2026-06-16 09:44:25</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/36080/avatar/9nnqx0.png?height=120&amp;width=120</url>
            <title>آرمان</title>
            <link>https://virgool.io/@espiar</link>
        </image>

                    <item>
                <title>فارسی سازی Aggregate Design Canvas و Bounded Context Canvas</title>
                <link>https://virgool.io/@espiar/%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-aggregate-design-canvas-%D9%88-bounded-context-canvas-ywqti3auaywv</link>
                <description>صرفا جهت اطلاع DDDArman-Espiar/aggregate-design-canvas-farsi: A structured approach to designing and documenting Aggregates-رویکردی ساختاریافته برای طراحی و مستندسازی Aggregate ها (github.com)Arman-Espiar/bounded-context-canvas-farsi: A structured approach to designing and documenting each of your bounded contexts (github.com)</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Sun, 17 Jul 2022 12:44:23 +0430</pubDate>
            </item>
                    <item>
                <title>خدا حافظ ویرگول</title>
                <link>https://virgool.io/@espiar/%D8%AE%D8%AF%D8%A7-%D8%AD%D8%A7%D9%81%D8%B8-%D9%88%DB%8C%D8%B1%DA%AF%D9%88%D9%84-arqhgemw7sqe</link>
                <description>سلام دوستان بی مقدمه میرم سر اصل مطلب  من دیگر در این سایت فعالیتی نخواهم داشت.چرا ؟ اگر دلیلشو می خواهید سایت ویرگول خیلی ضعیف هست. دلیل آخرش ناقص ذخره شدن  پست آخرم یعنی این: https://virgool.io/@espiar/%D8%B3%D8%A7%D8%AE%D8%AA-dark-theme-%D8%AA%D9%88%D8%B3%D8%B7-tailwindcss-nque5x9qxc1f برای اینکه اطمینان پیداکنم پیش نویس دوباره با یک عنوان دیگر ارسال کردم که نتیجش مثل قبل هست: https://virgool.io/@espiar/%D8%B3%D8%A7%D8%AE%D8%AA-dark-theme-%D8%AF%D8%B1-tailwindcss-louorafz2ekg متاسفانه روی ویرایش مطالب کلیک کردم پیش نویس هم پرید!:پیشتر هم یکبار این تصمیم رو گرفته بودم: https://virgool.io/@espiar/%DA%A9%D9%88%DA%86-%D8%A7%D8%B2-%D9%88%DB%8C%D8%B1%DA%AF%D9%88%D9%84-whgryjtcr4yv اگر روزی کانال آپارات زدم اینجا به عنوان آخرین پست اعلام می کنم.کلام آخر: من خودم یک جمله معروف دارم (البته برای خودم و اطرافیانم که من را می شناسند) :هرکی به حرفم گوش نداد ضرر کرد، حتی خود من!آرمان (ع)یک روزی این رو روی دستم تتو (تاتو) میکنم !امیدوارم این پست ناقص منتشر نشود !حداقل کپی میکنید، برابر اصل کنید. خدا حافظ همگی.</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Mon, 19 Oct 2020 19:54:24 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت Dark Theme در Tailwindcss</title>
                <link>https://virgool.io/@espiar/%D8%B3%D8%A7%D8%AE%D8%AA-dark-theme-%D8%AF%D8%B1-tailwindcss-louorafz2ekg</link>
                <description>گیت هاب افزونه وجود دارد که (اگر اشتباه نکنم) بر اساس تم ویندوز تم سایت تنظیم میکنه.نکته: اگر&quot;darkSelector&quot; که کارش تغییر نام کلاس پیشفرض mode-dark. بود، تغییر دادید باید در فایل js نیز همان نام جدید را جایگزین کنید.اگر از PurgeCSS برای کم کردن حجم فایل استفاده میکنیدباید در آرایه whitelist نام کلاس را قرار دهید:whitelist: [&#039;mode-dark&#039;]و فایل prefers-dark.js در content آرایه قرار دهید:content: [
  &#039;**/*.js&#039;,
  &#039;./node_modules/tailwindcss-dark-mode/prefers-dark.js&#039;,
  &#039;./or/your/own/prefers-dark.js&#039;
]در غیر این صورت PurgeCSS که کارش کم حجم کردن کد نهایی هست کد های تم تاریک هم پاک خواهد کرد!کلا تمام ! ?کمکردنحجمفایلنهاییTailwindcssبهروشحذفکلاسهایاستفادهنشدهسلام!عنوانکاملاگویاهست!قبلادراینبارهنوشتمولیاینروشدوماستvirgool.io افزونه و منبع البته مستندات افزونه بروزتر هست!</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Mon, 19 Oct 2020 19:35:57 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت Dark Theme توسط Tailwindcss</title>
                <link>https://virgool.io/@espiar/%D8%B3%D8%A7%D8%AE%D8%AA-dark-theme-%D8%AA%D9%88%D8%B3%D8%B7-tailwindcss-nque5x9qxc1f</link>
                <description>گیت هاب افزونه وجود دارد که (اگر اشتباه نکنم) بر اساس تم ویندوز تم سایت تنظیم میکنه.نکته: اگر&quot;darkSelector&quot; که کارش تغییر نام کلاس پیشفرض mode-dark. بود، تغییر دادید باید در فایل js نیز همان نام جدید را جایگزین کنید.اگر از PurgeCSS برای کم کردن حجم فایل استفاده میکنیدباید در آرایه whitelist نام کلاس را قرار دهید:whitelist: [&#039;mode-dark&#039;]و فایل prefers-dark.js در content آرایه قرار دهید:content: [
  &#039;**/*.js&#039;,
  &#039;./node_modules/tailwindcss-dark-mode/prefers-dark.js&#039;,
  &#039;./or/your/own/prefers-dark.js&#039;
]در غیر این صورت PurgeCSS که کارش کم حجم کردن کد نهایی هست کد های تم تاریک هم پاک خواهد کرد!کلا تمام ! https://virgool.io/@espiar/%DA%A9%D9%85-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AD%D8%AC%D9%85-%D9%81%D8%A7%DB%8C%D9%84-%D9%86%D9%87%D8%A7%DB%8C%DB%8C-tailwindcss-%D8%A8%D9%87-%D8%B1%D9%88%D8%B4-%D8%AD%D8%B0%D9%81-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%86%D8%B4%D8%AF%D9%87-s914aw20a15t افزونه و منبع البته مستندات افزونه بروزتر هست!</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Mon, 19 Oct 2020 19:30:05 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت Razor Class Library برای کامپوننت های Blazor در .NET5 RC2</title>
                <link>https://virgool.io/@espiar/%D8%B3%D8%A7%D8%AE%D8%AA-razor-class-library-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-%D9%87%D8%A7%DB%8C-blazor-%D8%AF%D8%B1-net5-rc2-rmhd96emrvbt</link>
                <description>من از .NET5 RC2 استفاده میکنم، شاید بعدا یک template مخصوص این کار بسازن. به هر حال، برم سر اصل مطلب  ابتدا یک Razor Class Library می سازیم. دقت کنید که هنگام ساخت تیک گزینه Support pages and views بزنید.بعد باید وارد فایل csproj کتابخانه ای که ساختید بروید و خط زیر را پاک کنید(دابل کلیک روی نام کتابخانه ای که ساختید):&lt;FrameworkReference Include=&amp;quotMicrosoft.AspNetCore.App&amp;quot /&gt;بجاش خط زیر رو قرار می دهیم:&lt;PackageReference Include=&amp;quotMicrosoft.AspNetCore.Components.WebAssembly&amp;quot Version=&amp;quot5.0.0-rc.2.20475.17&amp;quot /&gt;فایل _Imports.razor برای راحتی کار قرار میدهیم(می توانید بجای استفاده از این فایل namespace ها رو درون خود کامپوننت ها قرار دهیم. بنظر من قرار دادن namespace ها درون خود کامپوننت ها بهترم هست):@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInteropتمام ! حالا کتابخانه بدون هیچ خطایی به پروژه Blazor خود اضافه کنید.فایل csproj. کتابخانهالبته میتوانید بجای&lt;PackageReference Include=&amp;quotMicrosoft.AspNetCore.Components.WebAssembly&amp;quot Version=&amp;quot5.0.0-rc.2.20475.17&amp;quot /&gt;از خط زیر نیز استفاده کنید: &lt;PackageReference Include=&amp;quotMicrosoft.AspNetCore.Components&amp;quot Version=&amp;quot5.0.0-rc.2.20475.17&amp;quot /&gt;در این صورت فایل _Imports.razor هم سبکتر میشود:@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Fri, 16 Oct 2020 13:25:24 +0330</pubDate>
            </item>
                    <item>
                <title>عبارت های با قاعده - Regular Expressions</title>
                <link>https://virgool.io/@espiar/%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D8%A8%D8%A7-%D9%82%D8%A7%D8%B9%D8%AF%D9%87-regular-expressions-imcotitmxmga</link>
                <description>&quot;\&quot; =&gt; متا کاراکتر Escape یا Escape Character تمامی متا کاراکتر ها برای تطبیق خود نشانه متا کاراکتر در متن نیاز به Escape Character دارند.مثال: &quot;\\&quot; =&gt; پیدا کردن &quot;\&quot; در متن و یا &quot;.\&quot; پیدا کردن &quot;.&quot; در متن&quot;.&quot; =&gt; هر کاراکتری&quot;[&quot; و &quot;]&quot; =&gt; هر کارکتری بین  [ و ]  به عنوان کارکتر مجاز بعدی شناخته میشود.توجه داشته باشید که تنها یکی از کاراکترهای مجموعه که بین  [ و ] قرار میگیرند می توانند به عنوان کارکتر مجاز بعدی وجود داشته باشند نه تمامی آن کاراکتر ها.&quot;-&quot; =&gt; تعیین محدوده در بین &quot;[&quot; و &quot;]&quot;مثال: [9-0] یا [A-Za-z] یا [A-Za-z0-9]نکته &quot;-&quot; در خارج از &quot;[&quot; و &quot;]&quot; همان کارکتر &quot;-&quot; می باشد و نیازی به Escape character ندارد.&quot;^&quot; =&gt; تطبیق هر کاراکتری بجز در بین &quot;[&quot; و &quot;]&quot;مثال: [9-0^] =&gt;به معنی هر کارکتری بجز عدد.متا کاراکتر های Whitespace &quot;[b\]&quot; =&gt; تطبیق کلید backspace&quot;f\&quot; =&gt; تطبیق کلید Form feed&quot;r\&quot; =&gt; تطبیق کلید Carriage return (فضایی که دکمه Enter ایجاد میکند و به ابتدای خط بعدی میرود)&#x27;&#x27;t\&quot; =&gt; تطبیق کلید Tab&quot;v\&quot; =&gt; تطبیق کلید Vertical tabنکته: سیستم عامل ویندوز برای تشخیص انتهای یک خط در یک فایل از کاراکترهای r\n\ استفاده میکند. اما Unix و Linux فقط از n\ بدین منظور استفاده میکنند. پس برای تطبیق حتما n\ باید باشد ولی وجود r\ اختیاری است.پرکاربردترین ها: r\ و n\ و t\ می باشد.میانبر ها&quot;d\&quot; =&gt; میانبر [9-0] تطبیق هر عددی&quot;D\&quot; =&gt; میانبر [9-0^] تطبیق هر کاراکتری بجز رقمنکته کلی مهم: متاکاراکترهایی مانند متاکاراکترهای بالا (d\ و D\) - اگر حرف کوچک باشند به معنای تطبیق آن متاکاراکتر و اگر با حرف بزرگ باشند به معنای تطبیق هر کاراکتر بجز آن متاکاراکتر است.میانبرها&quot;w\&quot; =&gt; میانبر [_a-zA-Z0-9] تطبیق هر کارکتر عددی و حرف کوچک و بزرگ و زیر خط&quot;W\&quot; =&gt; میانبر [_a-zA-Z0-9^] تطبیق هر کارکتر بجز عددی و حرف کوچک و بزرگ و زیر خطمیانبر کارکترهای نامرئی&quot;s\&quot; =&gt;  میانبر [f\n\r\t\v\] تطبیق هر کاراکتر نامرئی&quot;S\&quot; =&gt; میانبر [f\n\r\t\v\^] تطبیق هر بجز کاراکتر نامرئیمتاکاراکتر Ctrl&quot;c\&quot; =&gt; تطبیق فشرده شدن دکمه Ctrl به همراه دکمه دیگرمثال: cZ\ بررسی فشرده شدن کلیدهای Ctrl و Z  درمتن - البته همه زبان های برنامه نویسی پشتیبانی این متاکاراکتر را پشتیبانی نمی کنند.تطبیق یک یا چند کارکتر&quot;+&quot; =&gt; متاکارکتر + تطبیق یک یا تعداد نامحدودی از کارکتر ها (حداقل یک کارکتر باید وجود داشته باشد.) مثال: برای تطبیق یک یا چند کاراکتر (یا یک مجموعه از کاراکترها که بین [ و ] قرار میگرند) =&gt; +[9-0] نکته کلی مهم: اگر متا کارکتر هایی مانند &quot;+&quot; درون مجموعه (بین [ و ] ) قرار دهید به معنای خود کاراکتر می باشد. به عبارت دیگر [+9-0] به معنای تطبیق یک عدد و یا کاراکتر + میباشد. درواقع درون [ و ] نیازی به Escape character نیست، هرچند اگر Escape character قرار دهید هم مشکلی ایجاد نمیکند. (شخصا پیشنهاد میکنم با Escape character بنویسید.)تطبیق صفر یا چند کاراکتر&quot;*&quot; =&gt; مانند متاکاراکتر &quot;+&quot; با این تفاوت که، صفر یا تعداد بیشتری از کاراکترها یا اعضای یک مجموعه را بررسی میکند.تطبیق صفر یا یک کاراکتر&quot;?&quot; =&gt; مانند متاکاراکتر &quot;+&quot; با این تفاوت که، برای بررسی وجود یک یا صفر کاراکتر استفاده میشود. کاربر مهم این متاکاراکتر بررسی صحت وجود یک کاراکتر اختیار است.تعیین دقیق دفعات تکرار (Intervals)&quot;{&quot; و &quot;}&quot; =&gt; بین متاکاراکتر &quot;{&quot; و &quot;}&quot; عدد تعداد دفعات تکرار قرار میگیرد. به عنوان مثال {3} و در جلوی کاراکتر یا مجموعه ای از کارکترها (جلوی عبارت باقاعده) قرار میگیرند، اگر آن عبارت دقیقا با تعداد دفعات تکرار برابر بود مورد تطبیق قرار میگیرد در غیر این صورت موردی تطبیق داده نمیشود.مثال: {4}[9-7] =&gt; در متن دقیقا 4 مرتبه یکی از عداد 7 ، 8 یا 9 (پشت سرهم) باید وجود داشته باشند.به عبارت دیگر هر عدد 4 رقمی که تمامی رفم های آن از 7 یا 8 یا 9 تشکیل شده را تطبیق بده.تعیین حداقل و حداکثر تعداد دفعات تکرار (Intervals)استفاده از &quot;{&quot; و &quot;}&quot; به صورت {n,m} =&gt; به معنای n حداقل و m حداکثر تعداد دفعات تکرار.مشاهده مثالنکته: با صفر نیز میتوان شروع شود. مثال {0,3} به معنای تطبیق صفر یا یک یا دو یا سه کاراکتر یا مجموعه است.تعیین حداقل تعداد دفعات تکرار (Intervals)استفاده از &quot;{&quot; و &quot;}&quot; به صورت {,n} =&gt; به معنای n حداقل تعداد دفعات تکرار.نکته: حتما &quot;,&quot; قرار دهید. در غیر این صورت همان &quot;تعیین دقیق دفعات تکرار&quot; هست !مشاهده مثالنکته: متاکاراکتر&quot;+&quot; معادل {,1} است.جلوگیری از تطبیق اضافهتنبل کردن متاکاراکترهای حریض * و + {,n} با استفاده از متا کاراکتر ? برای جلوگیری از تطبیق اضافه.?* و ?+ و ?{,n}مشاهده مثال متاکاراکترهای حریص&amp;amp;amp;amp;amp;lt;br/&amp;amp;amp;amp;amp;gt;مشاهده مثال متاکاراکترهای تنبلنکته: متاکاراکترهای حریص همیشه به دنبال بیشترین میزان قابل تطبیق در متن است. در مقابل متاکاراکترهای تنبل همیشه به دنبال کمترین میزان تطبیق در متن هستند.نشانه گذارهای کلمه (تطبیق مکانی)برای تشخیص و تطبیق ابتدا و انتهای یک کلمه استفاده می شود.&quot;b\&quot; =&gt; برای مشخص کردن یک کلمه به صورت مجزا (و نه به عنوان بخشی از یک کلمه ی دیگر)مشاهده مثال تطبیق ابتدای کلمه عبارت باقاعدهb\مشاهده مثال تطبیق کلمه کامل ویا ابتدا و انتهای کلمه (تطبیق کلمه) b\عبارت باقاعدهb\مشاهده مثال تطبیق انتهای کلمه b\عبارت باقاعده&quot;B/&quot; =&gt; برخلاف b/ - نکته کلی که پیشتر گفته شد را بیاد آورید!عبارت باقاعدهB\ =&gt; هرجا بجز ابتدای کلمهB\عبارت باقاعدهB\ =&gt; هرجا بجز ابتدا و انتها کلمهB\عبارت باقاعده =&gt; هرجا بجز انتهای کلمهنشانه گذارهای رشته (تطبیق مکانی)برای تشخیص و تطبیق ابتدا و انتهای کل رشته استفاده می شود.&quot;^&quot; برای تطبیق ابتدای کل رشته&quot;$&quot; برای تطبیق انتهای کل رشتهمثال: عبارت باقاعده^ =&amp;amp;amp;amp;amp;amp;gt; به معنای تطبیق ابتدای رشتهمثال: $عبارت باقاعده =&amp;amp;amp;amp;amp;amp;gt; به معنای تطبیق انتهای رشتهنکته مهم:متاکاراکتر &quot;^&quot; اگر در بین [ و ] ابتدای آن بیاید به معنای بجز است (پیشتر گفته شد). اگر ابتدای عبارت با قاعده بیاید به معنای ابتدای رشته است.(تطبیق مکانی)استفاده از حالت چند خطی - MultiLine (تطبیق مکانی) همه زبان ها پشتیبانی نمی کنند.&quot;(m?)&quot; =&gt; کاراکترهای &quot;r\n\&quot; به عنوان فاصله در نظر میگیرد. به عبارت دیگر متون واقع در ابتدا و انتهای یک خط جدید را نیز تطبیق می دهند.استفاده از حالت تک خطی - SingleLine (تطبیق مکانی) همه زبان ها پشتیبانی نمی کنند.&quot;(s?)&quot; =&gt; کاراکترهای خط جدید و شکستگی خط را به لیست کاراکترهایی که می توانند توسط متاکاراکتر&quot;.&quot; تشخیص دهد اضافه میکند.(برعکس &quot;(m?)&quot;).استفاده در هر دو حالت همزمان:استفاده به صورت (m)(?s?) ویا بطور مختصر (ms?)توضیحات بیشتردسته بندی عبارات باقاعده با زیرعبارت هامتاکاراکترهای &quot;(&quot; و &quot;)&quot; =&gt; برای دسته بندی کردن و ایجاد یک موجودیت جدید بکار گرفته میشوند.نکته: برای خوانایی بیشتر نیز می توان از زیرعبارت ها نیز استفاده کرد.مثال بدون استفاده از &amp;amp;amp;amp;amp;amp;quot;(&amp;amp;amp;amp;amp;amp;quot;و&amp;amp;amp;amp;amp;amp;quot;)&amp;amp;amp;amp;amp;amp;quot;مثال با استفاده از &amp;amp;amp;amp;amp;amp;quot;(&amp;amp;amp;amp;amp;amp;quot;و&amp;amp;amp;amp;amp;amp;quot;)&amp;amp;amp;amp;amp;amp;quot;نکته: &quot;(&quot;و&quot;)&quot; قابلیت استفاده تو در تو نیز دارند.نکته: یکی از کاربردهای اصلی زیرعبارت ها، کنترل تعداد تکرار مجموعه ای از کاراکترها است.متا کاراکتر &quot;یا&quot; &quot;|&quot; =&gt;این متا کارکتر بصورت &quot;یا&quot; عمل میکند.عبارت با قاعده دیگر (عبارت با قاعده راست | عبارت با قاعده چپ) برای دقیق بودن عبارت ما از &quot;(&quot;زیرعبارت&quot;)&quot; استفاده کردیم.&amp;amp;amp;amp;amp;amp;quot;(&amp;amp;amp;amp;amp;amp;quot;و&amp;amp;amp;amp;amp;amp;quot;)&amp;amp;amp;amp;amp;amp;quot; در این مثال پاک کنید و نتیجه را مشاهده کنید!تطبیق از طریق ارجاع به عقب با زیرعبارت ها&quot;عدد\(زیرعبارت)&quot; =&gt; &quot;عدد\&quot; این بخش ارجاع به عقب به عبارت قرار گرفته شده بین &quot;(&quot;و&quot;)&quot; است، و عدد آن مشخص کننده تطبیق کدام زیرعبارت است.به عنوان مثال &amp;amp;amp;amp;amp;quot;1\&amp;amp;amp;amp;amp;quot; اولین زیرعبارت موجود در عبارت باقاعده را تطبیق میدهد.&quot;2\&quot; دومین زیرعبارت را تطبیق میدهد و &quot;3\&quot; سومین زیرعبارت را تطبیق میدهد و ... .نکته: می توان قابیلت ارجتع به عقب را به عنوان وجود یک متغییر موقت برای ذخیره ی مقدار یافت شده ی قبلی درنظر گرفت.نکته: ارجاع به عقب در #C  - کلاس match که شامل یک خاصیت با نام Groups است که مجموعه ای از موارد تطبیق شده را برگشت میدهد. به عنوان مثال : match.Groups[1] اولین مجموعه ی تطبیق شده را بر میگرداند.نکته: قابلیت ارجاع به عقب تنها در صورتی کار می کند که عبارتی که به آن مراجعه می شود یک زیرعبارت، یعنی عبارت باقاعده قرار گرفته بین &quot;(&quot;و&quot;)&quot; باشد.نکته: ارجاع به عقب از &quot;1\&quot; شروع میشود ولی در برخی از زبان ها از 0 نیز میتواند قرار بگیرد که 0 به معنای ارجاعی به کل عبارت است.جایگزاری (در زبان های مختلف روش های متفاوتی دارد)نکته: ارجاع به عقب و زیرعبارت ها، از اجزای اصلی در عملیات جایگزاری هستند.در #C از کلاس Replace() برای عملیات جایگزاری عبارت در رشته با توجه به عبارت باقاعده استفاده میشود.نکته: وقتی که قصد تغییر قالب عبارتی از شکلی به شکل دیگر را دارید بهتر است اجزای مختلف عبارت باقاعده را با استفاده از زیرعبارت ها  به قسمت های کوچکتری تقسیم کنید تا کنترل بیشتری بر روی نتیجه ی نهایی داشته باشید.تبدیل حروف کوچک و بزرگ (در بعضی زبان ها پشتیبانی میشود)&quot;E\&quot; =&gt; در صورتی که متاکاراکترهای L\ و U\ قبل از این متاکاراکتر وجود داشته باشند، عملکرد آنها را خنثی می کند.&quot;l\&quot; =&gt; کاراکتر یا عبارت بعد از خود را به حروف کوچک تبدیل میکند.&quot;L\&quot; =&gt; تمامی کاراکترهای بعد از خود را تا زمانی که به متاکاراکتر E\ برسد به حروف کوچک تبدیل میکند.&quot;u\&quot; =&gt; کارکتر یا عبارت بعد از خود را به حروف بزرگ تبدیل میکند.&quot;U\&quot; =&gt; تمامی کاراکترهای بعد از خود را تا زمانی که به متاکاراکتر E\ برسد به حروف بزرگ تبدیل میکند.نگاه به جلو و عقب Lookaroundنگاه به جلو - Lookahead: الگویی را در عبارت باقاعده تعیین میکند آما آن الگو به عنوان جزئی از موارد یافت شده برگشت داده نمیشود. برای ایجاد چنین عبارتی، باید آن را به عنوان یک زیرعبارت مشخص کرده و پیشوند آن را برابر با &quot;=?&quot; قرار دهیم. به عبارت دیگر، به راحتی میتوان هر زیرعبارتی را با قرار دادن &quot;=?&quot; در ابتدای آن قابلیت نگاه به جلو بخشید.مشاهده مثال نگاه به جلومشاهده مثال بدون نگاه به جلونکته: در یک عبارت باقاعده میتوان از چندین زیرعبارت با قابلیت نگاه به جلو استفاده کرد و این زیرعبارت ها را در هرجایی در عبارت باقاعده قرار داد.نگاه به عقب - Lookbehind: الگویی را در عبارت باقاعده تعیین میکند آما آن الگو به عنوان جزئی از موارد یافت شده برگشت داده نمیشود. برای ایجاد چنین عبارتی، باید آن را به عنوان یک زیرعبارت مشخص کرده و پیشوند آن را برابر با &quot;=&gt;?&quot; قرار دهیم. به عبارت دیگر، به راحتی میتوان هر زیرعبارتی را با قرار دادن &quot;=&gt;?&quot; در ابتدای آن قابلیت نگاه به عقب بخشید. (درست برعکس نگاه به جلو)مشاهده مثال نگاه به عقبمشاهده مثال بدون نگاه به عقبنگاه به عقب: عبارت &quot;=?&quot; به &quot;بعد&quot; از یک کارکتر یا گروهی از آنها نگاه کرده و در صورت تطبیق، آن را شناسایی میکند اما آن را به عنوان نتیجه برگشت نمیدهد.نگاه به جلو: عبارت &quot;=&gt;?&quot; به &quot;قبل&quot; از یک کاراکتر یا گروهی از آنها توجه میشود و در صورت تطبیق، آن را شناسایی میکند اما آن را به عنوان نتیجه برگشت نمیدهد.نکته: برای بخاطر سپردن راحتتر &quot;=&gt;?&quot; کاراکتر &quot;&gt;&quot; نگاه به عقب است و اگر آن را حذف کنیم نگاه به جلو است(&quot;=?&quot;)نکته مهم: زیرعبارتی که (زیرعبارت نه کل عبارت باقاعده) قابلیت نگاه به جلو بر روی آن عمل میکند، متغیر و شامل متاکاراکترهای &quot;.&quot;و&quot;+&quot; باشد اما این حالت برای قابلیت نگاه به عقب وجود ندارد و این محدودیتی است که تمامی زبان های برنامه نویسی برای قابلیت نگاه به عقب قائل هستند.ادغام قابلیت نگاه به عقب و نگاه به جلواین دو قابلیت را میتوان در یک عبارت باقاعده با همدیگر بکاربرد.مثال استفاده هم زمان و بدست آوردن مقدار تگ H1عکس نگاه به جلو و عکس نگاه به عقب&quot;!?&quot; =&gt; عکس نگاه به جلو یعنی &quot;=?&quot;&quot;!&gt;?&quot; =&gt; عکس نگاه به عقب یعنی &quot;=&gt;?&quot;نکته: برای برعکس کردن فقط کافیست بجای &quot;=&quot; از &quot;!&quot; استفاده کنید.اطلاعات بیشترعبارت شرطی (فقط در برخی زبان های پشتیبانی میشوند)برای تعریف عبارت شرطی از &quot;?&quot; استفاده میشود.نمونه های شرطی که قبلا معرفی شدند:اگر کارکتر یا مجموعه ای وجود داشت، کاراکتر &quot;?&quot; آن را تطبیق میدهد.اگر عبارت پیش رو یا پشت &quot;=?&quot; و &quot;=&gt;?&quot; در قابلیت های نگاه به جلو و عقب در متن وجود دشات، تطبیث پیدا میکند.انواع عبارات شرطی:عبارت شرطی بر مبنای ارجاع به عقبعبارت شرطی بر مبنای نگاه به جلو و عقبشرط در ارجاع به عقب: ارجاع به یک عبارت در صورتی انجام میشود که جستجوی قبلی یک زیرعبارت با موفقیت انجام شده باشد. با دستور (backreference)true)?) &quot;?&quot; شروع شرط را مشخص میکند &quot;(backrefrence)&quot; که باید حتما درون پرانتز باشد ، یک ارجاع به عقب است که در صورتی که ارجاع به عقب تطبیق پیدا کند بخش true اجرا خواهد شد. برای درک بهتر دستور بالا شبیه به دستور زیر در سی شارپ است:if(backrefrence)truetrue در بالا را یک قطع کد سی شارپ در نظر بگیرید.دستور کامل تز از دستور بالاتر نیز وجود دارد که در واقع بخش else به شرط اضافه میکند: (backreference)true|false)?)  که معادل کد سی شارپ زیر است:if(blackrefrence)trueelsefalseشرط در نگاه به جلو و عقب:عبارات باقاعده در صورتی تطبیق داده میشوند که هر یک از عبارات در نگاه به جلو و عقب تطبیق داده شوند. دستور  مانند عبارت شرطی در ارجاع به عقب است با این تفاوت که عدد درون پرانتز که معرف زیر عبارتی است که ارجاع به آن صورت میگیرد با یک عبارت به فرم نگاه به جلو و عقبجایگزین میشود.کلاس Regular Expression در #Cمتد IsMatch(): برای بررسی تطبیق وجود یک عبارت در یک رشته با توجه به الگوی عبارت باقاعده استفاده میشود.متد Match(): همانند متد IsMath() رفتار میکند با این تفاوت که در صورت یافتن اولین نتیجه، یک کلاس از نوع Match حاوی اطلاعات عبارت پیدا شده را برگشت میدهد.متد Matches(): مجموعه ای از تمامی عبارت تطبیق شده با عبارت باقاعده را به عنوان یک کلاس MatchCollection برگشت میدهد.متد Replace(): برای عملیات جایگزاری عبارت در رشته با توجه به عبارت باقاعده استفاده میشود.متد Split(): آرایه ای رشته ای را بر میگرداند. خانه های این آرایه با توجه به عبارت باقاعده و موارد یافت شده در رشته پر میشوند.منبع برای Regex در سی شارپمنبع و خرید کتاب</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Tue, 06 Oct 2020 15:04:49 +0330</pubDate>
            </item>
                    <item>
                <title>رفع مشکل redirect شدن blazor webassembly بعد از فراخوانی api</title>
                <link>https://virgool.io/@espiar/%D8%B1%D9%81%D8%B9-%D9%85%D8%B4%DA%A9%D9%84-redirect-%D8%B4%D8%AF%D9%86-blazor-webassembly-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-api-obmp9k9pvv2r</link>
                <description>مقدمهخوب برم سر اصل مطلب اگر پست های قبلی blazor دیده باشید من در مورد این ها صحبت کردم: https://virgool.io/@espiar/%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%AA%D8%B3%D8%AA-%D9%88%D8%A7%D8%AD%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-blazor-webassembly-aghnyjk6vxeg  https://virgool.io/@espiar/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identityserver4-ui-vyyncneeck6b  https://virgool.io/@espiar/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identity-server-cgphbndnln2x البته این دو تا آخری صرفا برای Blazor نیست ولی اگر  با blazor webassembly  کاردارید (بخصوص با تنظیمات پیش فرض) حتما با این دو پست همکار خواهید داشت!برای پایان مقدمه هم باید بگم چیزی که می خواهم الان بگم حدود 1 الی 2 هفته طول کشید که فقط  بفهمم که مشکل &quot;redirect شدن&quot; است! بریم سر اصل مطلبتنظیم پیش فرض blazor  در فایل Program.cs  پروژه Client به صورت زیر هست :builder.Services.AddHttpClient(&amp;quotWeb.ServerAPI&amp;quot, client =&gt; client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))				.AddHttpMessageHandler&lt;BaseAddressAuthorizationMessageHandler&gt;();دقیق تر بخواهم بگم مشکل redirect شدن از این خط شروع میشود:.AddHttpMessageHandler&lt;BaseAddressAuthorizationMessageHandler&gt;();کاری که این خط میکنه این که اینکه زمانی که می خواهد درخواستی (request) را به api خارجی ارسال کند، در مرورگر دنبال Access Token می گردد. اگر این Access Token پیدا شد آن را به request اضافه میکند و به سرور می فرستد. اگر این توکن پیدا نشد یک exception ایجاد میکند، برای همین از الگوی try...catch در component استفاده میکند:@code {
    private WeatherForecast[] forecasts;
    protected override async Task OnInitializedAsync()
    {
        try
        {
            forecasts = await Http.GetFromJsonAsync&lt;WeatherForecast[]&gt;(&amp;quotWeatherForecast&amp;quot);
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
} در قسمت catch این redirect اتفاق می افتد. کلا attribute هایی مانند [AllowAnonymous] یا [Authorize] چه در کامپوننت و چه در سطح api هیچ تاثیری روی این قضیه ندارند.برای درست کردن این موضوع باید کاری کنیم که api های خارجی که نیاز به access token ندارند، blazor در مرورگر دنبال access token نگردد و آن را به request اضافه نکند.این کار چند روش دارد که بهترین روش میگم دو روش دیگر در منبع ها هست.برای درست کردن باید یک کلاس با نام دلخواه (که من در اینجا از PublicClient استفاده کردم) میسازیم و در آن یک :    public class PublicClient
    {
        public HttpClient Client { get; }

        public PublicClient(HttpClient httpClient)
        {
            Client = httpClient;
        }
    }ما یک کلاس ساختیم که در سازنده آن یک httpClient فراخوانی کردیم. این روش چند مزیت دارد:کلاس ما بطور خودکار در DI ثبت میشود و می توانیم به راحتی از تزریق وابستگی استفاده کنیم.ما میتونم یک سری متد به کلاس بالا اضافه کنیم و از آن به راحتی استفاده کنیم.(کسپوله کردن یا wrapper کردن)در نهایت خط کد زیر را در  فایل Program.cs  پروژه Client به صورت زیر تعریف کنیم:	builder.Services.AddHttpClient&lt;PublicClient&gt;(client =&gt; client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));کل  فایل Program.cs  پروژه Client به صورت زیر میشود:	public class Program
	{
		public static async Task Main(string[] args)
		{
			var builder = WebAssemblyHostBuilder.CreateDefault(args);
			builder.RootComponents.Add&lt;App&gt;(&amp;quotapp&amp;quot);

			builder.Services.AddHttpClient(&amp;quotWeb.ServerAPI&amp;quot, client =&gt; client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
				.AddHttpMessageHandler&lt;BaseAddressAuthorizationMessageHandler&gt;();

			builder.Services.AddHttpClient&lt;PublicClient&gt;(client =&gt; client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));

			// Supply HttpClient instances that include access tokens when making requests to the server project
			builder.Services.AddScoped(sp =&gt; sp.GetRequiredService&lt;IHttpClientFactory&gt;().CreateClient(&amp;quotWeb.ServerAPI&amp;quot));
			builder.Services.AddApiAuthorization();

			await builder.Build().RunAsync();
		}
	}برای استفاده در کامپوننت هم باید به صورت زیر استفاده شود:@inject PublicClient PublicClient  
...  
 @code {   
  private async Task GetSomethingFromAPI()  
   {         var result = PublicClient.Client.GetFromJsonAsync&lt;Something&gt;(&amp;quot/api/something&amp;quot);     
   } 
}دقت کنید نیازی به الگوی try...catch هم نیست!اگر هم خواستید متدی را به کلاس PublicClient   اضافه کنید به صورت زیر هست :public class PublicClient
{
	private HttpClient _client
	public PublicClient(HttpClient httpClient)
	{
		_client = httpClient;
	}

	public async Task&lt;SomeThing&gt; GetSomething()
	{
		var result = await _client.GetFromJsonAsync&lt;SomeThing&gt;(&amp;quot/api/something&amp;quot);
		return result;
	}
}و نحوه استفاده هم:@inject PublicClient PublicClient
  ... 

  @code { 
    private async Task GetSomethingFromAPI()  
  {       
  var result = PublicClient.GetSomething(); 
    } 
}منظورم از کپسوله کردن یا wrapper هم همین مثال بالا بود.منبع این و اینموفق و پیروز باشید.</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Fri, 14 Aug 2020 01:10:26 +0430</pubDate>
            </item>
                    <item>
                <title>سفارشی کردن Identity Server4</title>
                <link>https://virgool.io/@espiar/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identity-server-cgphbndnln2x</link>
                <description>سلام در مطلب قبلی نحوه سفارشی کردن UI یا همان رابط کاربری Identity Server گفتم: https://virgool.io/@espiar/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identityserver4-ui-vyyncneeck6b در این مطلب می خواهم خود کلاس هاش را سفارشی کنیم. من فرض میکنم که شما یک پروژه Blazor Webassembly با Individual user account (که Authentication پیش فرض هست) ساختید.مرحله اول: ساخت ApiAuthorizationDbContext سفارشیاول از همه باید یک کلاس سفارشی DbContext بسازیم. من نام آن را CustomApiAuthorizationDbContext میگذارم. و کد زیر را درونش قرار میدهم:از اونجایی که ویرگول مثل همیشه با کد ها مشکل داره و این کد بسیار طولانی هست در تگ کد قرار نمیدهم!نکته مهمی که وجود دارد این هست که کدی که در منبع این مطلب هست ساده ترین کد است اما کدی که اینجا نوشتم کامل ترین حالت هست که باید هر 8 کلاس سفارشی بشود.شروع کدusing System;using System.Collections.Generic;using System.Text;using System.Threading.Tasks;using IdentityServer4.EntityFramework.Entities;using IdentityServer4.EntityFramework.Extensions;using IdentityServer4.EntityFramework.Interfaces;using IdentityServer4.EntityFramework.Options;using Microsoft.AspNetCore.Identity;using Microsoft.AspNetCore.Identity.EntityFrameworkCore;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Options;namespace InfoFinder.Infrastructure.Data.Data{/// &lt;summary&gt;/// Database abstraction for a combined &lt;see cref=&quot;DbContext&quot;/&gt; using ASP.NET Identity and Identity Server./// &lt;/summary&gt;/// &lt;typeparam name=&quot;TUser&quot;&gt;&lt;/typeparam&gt;/// &lt;typeparam name=&quot;TRole&quot;&gt;&lt;/typeparam&gt;/// &lt;typeparam name=&quot;TKey&quot;&gt;Key of the IdentityUser entity&lt;/typeparam&gt;public class KeyApiAuthorizationDbContext&lt;TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken&gt; : IdentityDbContext&lt;TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken&gt;, IPersistedGrantDbContextwhere TUser : IdentityUser&lt;TKey&gt;where TRole : IdentityRole&lt;TKey&gt;where TKey : IEquatable&lt;TKey&gt;where TUserClaim : IdentityUserClaim&lt;TKey&gt;where TUserRole : IdentityUserRole&lt;TKey&gt;where TUserLogin : IdentityUserLogin&lt;TKey&gt;where TRoleClaim : IdentityRoleClaim&lt;TKey&gt;where TUserToken : IdentityUserToken&lt;TKey&gt;{private readonly IOptions&lt;OperationalStoreOptions&gt; _operationalStoreOptions;/// &lt;summary&gt;/// Initializes a new instance of &lt;see cref=&quot;ApiAuthorizationDbContext{TUser, TRole, TKey}&quot;/&gt;./// &lt;/summary&gt;/// &lt;param name=&quot;options&quot;&gt;The &lt;see cref=&quot;DbContextOptions&quot;/&gt;.&lt;/param&gt;/// &lt;param name=&quot;operationalStoreOptions&quot;&gt;The &lt;see cref=&quot;IOptions{OperationalStoreOptions}&quot;/&gt;.&lt;/param&gt;public KeyApiAuthorizationDbContext(DbContextOptions options,IOptions&lt;OperationalStoreOptions&gt; operationalStoreOptions): base(options){_operationalStoreOptions = operationalStoreOptions;}/// &lt;summary&gt;/// Gets or sets the &lt;see cref=&quot;DbSet{PersistedGrant}&quot;/&gt;./// &lt;/summary&gt;public DbSet&lt;PersistedGrant&gt; PersistedGrants { get; set; }/// &lt;summary&gt;/// Gets or sets the &lt;see cref=&quot;DbSet{DeviceFlowCodes}&quot;/&gt;./// &lt;/summary&gt;public DbSet&lt;DeviceFlowCodes&gt; DeviceFlowCodes { get; set; }Task&lt;int&gt; IPersistedGrantDbContext.SaveChangesAsync() =&gt; base.SaveChangesAsync();/// &lt;inheritdoc /&gt;protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value);}}/// &lt;summary&gt;/// Database abstraction for a combined &lt;see cref=&quot;DbContext&quot;/&gt; using ASP.NET Identity and Identity Server./// &lt;/summary&gt;/// &lt;typeparam name=&quot;TUser&quot;&gt;&lt;/typeparam&gt;public class ApiAuthorizationDbContext&lt;TUser&gt; : KeyApiAuthorizationDbContext&lt;TUser, IdentityRole, string, IdentityUserClaim&lt;string&gt;, IdentityUserRole&lt;string&gt;, IdentityUserLogin&lt;string&gt;, IdentityRoleClaim&lt;string&gt;, IdentityUserToken&lt;string&gt;&gt;where TUser : IdentityUser{/// &lt;summary&gt;/// Initializes a new instance of &lt;see cref=&quot;ApiAuthorizationDbContext{TUser}&quot;/&gt;./// &lt;/summary&gt;/// &lt;param name=&quot;options&quot;&gt;The &lt;see cref=&quot;DbContextOptions&quot;/&gt;.&lt;/param&gt;/// &lt;param name=&quot;operationalStoreOptions&quot;&gt;The &lt;see cref=&quot;IOptions{OperationalStoreOptions}&quot;/&gt;.&lt;/param&gt;public ApiAuthorizationDbContext(DbContextOptions options,IOptions&lt;OperationalStoreOptions&gt; operationalStoreOptions): base(options, operationalStoreOptions){}}}پایان کدمرحله دوم ساخت کلاس های سفارشیکلاس های زیر کلاس های سفارشی Identity معمولی می باشد:TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserTokenکه سفارشی کردنشو در پست پایین و  منبع آمده (البته منبع کامل تر هست) https://virgool.io/@espiar/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identity-%D8%AF%D8%B1-dotnetcore31-idbh9ahawqvh مرحله سوم جایگزین کردن Context سفارشی که در مرحله اول ساختیم بجای Context پیشفرضبعد باید dbContext سفارشی خودمان را جایگزین dbContext پیش فرض کنیم و 8 کلاس سفارشی هم به آن پاس بدیهم:مرحله چهارم تغییر فایل Startupحالا باید کلاس های سفارشی را در فایل Stratup به Identity پاس دهیم:کلاس های ApplicationUser و ApplicationRole سفارشی من هستند که به Services.AddDefaultIdentity پاس دادمتنها خطی که فایل startup اضافه شد کد زیر هست:.AddRoles&lt;ApplicationRole&gt;()باقس کد بطور پیشفرض وجود دارد فقط باید نام کلاس سفارشی جایگزین کنید.نکته: نام کلاس سفارشی user من ApplicationUser هست. که بطور پیشفرض این کلاس سفارشی (و البته خالی) وجود دارد.و مرحله پنجم و آخرابتدا Migration  ها رو پاک می کنیم و بعد اگر دیتابیس ساخته شده  آن هم پاک میکنیم.و دستورات زیر را میزنیم:Add-Migration MigrationNameUpdate-Databaseدستورات بالا که پرواضح و برای EntityFramework هست. این دستورات باید بدون خطا انجام شوند در غیر این صورت جاییرو مثل این مطلب پیش نرفتید.منابع: https://stackoverflow.com/questions/58208894/aspnet-core-identity-custom-apiauthorizationdbcontext و https://docs.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-3.1#customize-the-model </description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Tue, 04 Aug 2020 21:21:11 +0430</pubDate>
            </item>
                    <item>
                <title>کرک کردن Pinegrow 5.97 !</title>
                <link>https://virgool.io/@espiar/%DA%A9%D8%B1%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-pinegrow-597-wwfw4vasyuya</link>
                <description>مقدمهاگر سوال پیش آمده چه را Pinegrow این پست ببینید: https://virgool.io/@espiar/%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-tailwindcss-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-pinegrow-%D9%88-%D8%AF%DB%8C%DA%AF%D8%B1-%D9%87%DB%8C%DA%86-cwcmdysmzvxy و حالا چرا به Pinegrow 5.97 نیاز داریم ؟ دلیل اینکه حالا می توانیم بدون دردسر از Tailwindcss استفاده کنیم !(هرچند که من فقط طراحی را درون Pinegrow انجام میدم اما آخر سر خودم فایل Tailwindcss می سازم که آموزش هاش در مطلب بالا هست)متاسفانه فعلا آخرین نسخه یعنی نسخه 5.97 هیچ کرکی ندارد ! پس تیتر &quot;کرک کردن Pinegrow 5.97 !&quot; چیه ؟ هیچی با این روش فقط نسخه آزمایش بطور نا محدود استفاده میکنیم! که خوشبختانه نسخه آزمایشی تمامی امکانات نسخه Pro را دارد!. نکته: چون ارزش ریال روز به روز در حال پایین آمدن است و ما قدرت و امکان خرید هم نداریم این مطلب می نوسیم.مواد لازم:اول از همه آخرین نسخه را از سایت اصلی دانلود کنید.پس از نصب برنامه اولین کار و مهم ترین کاری که باید انجام بدید این هست که یک کپی از فولدر Pinegrow که در آدرس زیر هست را یک جا برای خود ذخیره کنید(دلیلشو بعدا میگم) :C:\Users\YourUser\AppData\Localبه عنوان مثال آدرس من اینطوری هست:C:\Users\Arman Es\AppData\Localبعد برنامه را اجرا کرده و پنجره ای مانند تصویر زیر مشاهده می کنید:در قسمت Start trial باید ایمیل استفاده کنید ولی چون هر ایمیل 1 کد مخصوص دارد ما از سایت هایی که ایمیل موقت میدهند استفاده میکنیم. به عنوان نمونه کلیک کنید.بعد از وارد کردن ایمیل، کد به ایمیل شما ارسال میکه که در کادر بالا میزنید و نسخه آزمایشی 7 روز استفاده می کنید.پس از اتمام 7 روز وقتی برنامه را اجرا میکنید با پنجره زیر روبرو میشوید:ابتدا برنامه را ببندید. حالا اون فولدر Pinegrow که یک کپی ازش ذخیره کردیم را ، کپی گرفته و در همان محل قبلیش (که آدرس و نمونه ادرس بالا گفتم!) پیست می کنیم.دوباره برنامه را اجرا کنید ! یک ایمیل موقت دیگر و... این چرخه ادامه دارد !?تمام !</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Tue, 28 Jul 2020 20:31:45 +0430</pubDate>
            </item>
                    <item>
                <title>افزونه مترجم visual studio</title>
                <link>https://virgool.io/@espiar/%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%D9%85%D8%AA%D8%B1%D8%AC%D9%85-visual-studio-jpuik15xnb0k</link>
                <description>مقدمهخوب من بعد از نصب Identity ui  با کلی Page و UI روبرو شدم که باید فارسی سازیشون میکردم. خوب اگر می خواستم تک به تک  کپی کنم بعد توی مثلا متجرم گوگل پیست کنم بعد ترجمه کپی کنم و بعد دوباره در سر جایش پیست کنم با اون حجم متن خیلی وقت گیر می شد.برای همین دنبال افزونه ای برای صرفه جویی در وقت شدم که به این افزونه بر خوردم...افزونه Visual-Studio-Translator برای دانلود می تونید از خود ویژوال استودیو نام افزونه جستجو و نصب کنید و یا از طریق لینک افزونه آن را ابتدا دانلود و سپس نصب کنید.مزیتی که این افزونه دارد استفاده از چند سایت مختلف هست که عبارت انداز :Google, Bing, Baidu و Youdaoبرای استفاده هم اول متن رو select میکنید بعد یکی از Sortcut key زیر را بسته به نیازتون انجام میدین:Google Translate(Ctrl + Shift + D, Ctrl + Shift + D)Bing Translate(Ctrl + Shift + D,ctrl + Shift + F)Baidu Translate(Ctrl + Shift + D,ctrl + Shift + C)Youdao Translate(Ctrl + Shift + D,ctrl + Shift + V)نکته: بطور پیشفرض متن را به چینی ! ترجمه می کند .برای تنظیم زبان (و بطور کلی تنظیمات) باید روی چرخ دنده که در تصویر میبینید کلیک کنید و زبان مقصد تک تک سایت ها رو روی فارسی قرار دهید.تصویر بالا تنظمات برای مترجم گوگل هست باید برای بقیه هم همین تنظیمات را انجام دهید.برای تغییر کلید میانبر هم باید به این آدرس برید: tools-&gt;options-&gt;environment-&gt;keyboard , then search &quot;Translator&quot;.تمام این توضیحات در صفحه افزونه هم هست</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Tue, 28 Jul 2020 12:34:51 +0430</pubDate>
            </item>
                    <item>
                <title>نوشتن تست واحد برای Blazor WebAssembly</title>
                <link>https://virgool.io/@espiar/%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%AA%D8%B3%D8%AA-%D9%88%D8%A7%D8%AD%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-blazor-webassembly-aghnyjk6vxeg</link>
                <description>مقدمه برای تست من از xUnit  استفاده میکنم.ابتدا این پروژه را دانلود کنید.آماده سازی Solutionاول پروژه Blazor Web Assembly و xUnit  می سازیم.سپس پروژه ای که دانلود کردیم رو با استفاده از add existing project به solution خودمون اضافه میکنم.و بعد رفرنس Server را و پروژه ای که اضافه کردیم را اضافه میکنم:نکته: چون server درون خودش به Client و Shared رفرنس دارد نیازی به تیک زدن آن پروژه ها نیست.نکته: مطمئن بشید که تمام NuGet پکیج ها کامل دانلود شده باشند.خوب آماده سازی Solution تمام شد!نحوه کار کردنکلاس TestHost: کار این کلاس رندر کردن کامپوننت های Blazor هست.یک نمونه ای از تست:using System;
using Xunit;

namespace DevOpsBlazor.UnitTests
{
    public class IndexPageUnitTests
    {
       TestHost host = new TestHost();
        [Fact]
        public void ShouldRenderHello()
        {
var component = host.AddComponent&lt;Web.Client.Pages.Index&gt;();
			// Assert h1
			Assert.Equal(&amp;quotHello, world!&amp;quot, component.Find(&amp;quoth1&amp;quot).InnerText);
			// Assert text in the body
			Assert.Contains(&amp;quotWelcome to your new app.&amp;quot, component.GetMarkup());
			// Assert if survey component exists
			Assert.NotNull(component.Find(&amp;quot.alert.alert-secondary&amp;quot));
			// Assert the link
			Assert.Equal(
				&amp;quothttps://go.microsoft.com/fwlink/?linkid=2127996&amp;quot,
				component.Find(&amp;quota&amp;quot).Attributes[&amp;quothref&amp;quot].Value);
        }
    }
}کار کردن با پارامتر هاکامپوننت SurveyPrompt که در Index Component  به کار رفته ، دارای یک Parameter می باشد (با نام Title) برای همین باید جدا تست کنیم.using Microsoft.AspNetCore.Components.Testing;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;

namespace DevOpsBlazor.UnitTests
{
    public class SurveyPromptUnitTests
    {
        TestHost host = new TestHost();

        [Fact]
        public void ShouldRenderTitle()
        {
var title = &amp;quotTest&amp;quot
var parameters = new Dictionary&lt;string, object&gt;() { { &amp;quotTitle&amp;quot, title } };
var component = host.AddComponent&lt;SurveyPrompt&gt;(parameters);
Assert.Equal(title, component.Find(&amp;quotstrong&amp;quot).InnerText);
        }
    }
}همانطور که در کد بالا می بینید  ما پارامتر رو به کامپوننت پاس دادیم. نتیجه آن:تمام.این هم یک Cheat sheet مانند از xUnit https://xunit.net/docs/comparisons و در نهایت منبعکلام آخرهدف من از این آموزش آماده سازی solution بود. اگر می خواهید تست ها پیچیده تر بنویسید مثلا استفاده از Private method ها ، استفاده از Dependency Injection و ... قسمت دوم آموزش و قسمت های بعد از آن را حتما ببینید. </description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Sun, 19 Jul 2020 19:55:39 +0430</pubDate>
            </item>
                    <item>
                <title>سفارشی کردن IdentityServer4 UI</title>
                <link>https://virgool.io/@espiar/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identityserver4-ui-vyyncneeck6b</link>
                <description>مقدمه من یک پروژه  Blazor WebAssembly به همراه Asp.Net Core Hosted و Individual user account (که Authentication پیش فرض هست) ساختم.  مشکلی که داشتم این بود که Page ها و View یا همون UI سیستم پیشفرض Identity server 4 همراهش نبود. برای این که بتوانم UI تغییر بدم باید این کار هارو انجام بدم.اضافه کردن UI و Pages به برنامهخوب چون موقع ساخت پروژه تیک Asp.Net Core Hosted هم زدم خودش یک پروژه Asp.Net Core می سازه که برای ساخت Api هست و هیچ ربطی به Blazor-Server ندارد!.روی این پروژه که پسوند server نیز دارد کلیک راست کرده و مانند تصاویر زیر عمل کنید:از پنجره جدید که باز میشه Identity انتخاب کنید:و بعد پنجره زیر باز میشود که باید Override all file تیک زده و Context بهش معرفی کنیم:بعد از شاخته شدن پوشه Identity پر میشه از Page و View ها ، می توانیم به هر شکل که خواستیم سفارشی سازی کنیم.!تمام! حالا پروژه را اجرا کنید اما صبر کنید وقتی وارد صفحه login یا register می شویم خطای زیر را می دهد:خوب همانطور که از متن خطا پیداست باید section Scripts را در فایل _Layout.cshtml که در فولدر اصلی  Pages&gt;Shared  قرار داد خط زیر را اضافه کنیم:@RenderSection(&amp;quotScripts&amp;quot, required: false)حالا دیگر جدی جدی تمام !افزونه ای که میتواند برای فارسی سازی این همه UI و Page  کمکان کند: https://virgool.io/@espiar/%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%D9%85%D8%AA%D8%B1%D8%AC%D9%85-visual-studio-jpuik15xnb0k </description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Sat, 18 Jul 2020 15:56:39 +0430</pubDate>
            </item>
                    <item>
                <title>بروز کردن nodejs و typescript و همچنین کامپایل گروهی فایل های ts</title>
                <link>https://virgool.io/@espiar/%D8%A8%D8%B1%D9%88%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-nodejs-%D9%88-typescript-%D9%88-%D9%87%D9%85%DA%86%D9%86%DB%8C%D9%86-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84-%DA%AF%D8%B1%D9%88%D9%87%DB%8C-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C-ts-ocvbyqhywitk</link>
                <description>ظاهرا در نسخه جدید nodejs تغییراتی ایجاد شده که بروز رسانی کمی فرق کرده مه این تغییرات بر روی تایپ اسکریپت هم تاثیر گذاشته است (اجرای دستورات cl).روش اول اینکه برید داخل سایت nodejs و فایل نصبی را دانلود کنید و سپس نصب کنید.روش دیگر این هست با استفاده از PowerShell این کار رو انجام بدیم. برای این منظور ابتدا PowerShell در حالت as Administrator باز میکنم و دستورات زیر را قرار  میدهیم:Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
npm install -g npm-windows-upgrade
npm-windows-upgradeتمام!بعد بروزرسانی nodejs  می توانیم type script را با دستور بروز کنیم :npm install -g typescript(من از nodejs نسخه 10 استفاده میکردم و موقع اجرای دستور بالا خطا می داد تا اینکه nodejs به آخرین نسخه بروز کردم)تمام!نکته :اگر بروزرسانی به روش اول انجام داده باشین (نصب فایل نصبی !) موقع اجرای دستور  زیر:tsc --init(که کار ساخت فایل تنظیمات ts را بر عهده دارد .- tsconfig.json می سازد. برای اطلاعات بیشتر به نکته آخر توجه کنید)با خطای زیر مواجه می شوید:tsc.ps1 cannot be loaded because running scripts is disabled on   this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.  At line:1 char:1+ tsc --initبرای حل این مشکل باید مانند روش دوم در حالت as Administrator به PowerShell رفته و دستور زیر را اجرا کنید:Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Forceتمام!نکته آخراز فایل تنظیمات (tsconfig.json) برای تنظیم کردن خودکار کامپایل کردن گروهی فایل های ts  از این فایل استفاده میکنیم:به آدرس ها و فایل ها نگاه کنید. در تصویر سعی شده همه صحبت ها بعدی را پوشش دهد.(بعد از 5 بار آپلود تصویر بالاخره ویرگول آپلود کرد!)در حالت پیش فرض هرجایی که ts قرار داشته باشد فایل js هم همان جا قرار می گیرد. برای تغییر این رفتار همانطور که در عکس مشاهده کردید از بخش outDir و rootDir استفاده میکنیم.قسمت outDir  آدرس خروجی رو می گیرد (جایی که فایل های js ساخته میشوند)قسمت rootDir آدرس فایل های ts می باشد (می توانید این قسمت را رها کنید)قسمت outFile آدرس خروجی میگیرد که تمام فایل ها به یک فایل تبدیل میکند.در کل توضیحات هر قسمت روبروش نوشته شدهو حالا برای اینکه با هربار تغییر نخواهیم دستور tsc برای کامپایل کردن در ترمینال  تکرار کنیم کافیست فقط یک بار دستور زیر را بنویسید:tsc -wمنبع بخش اول، منبع بخش دوم و منبع نکته آخر</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Wed, 20 May 2020 14:39:01 +0430</pubDate>
            </item>
                    <item>
                <title>کم کردن حجم فایل نهایی Tailwindcss به روش حذف کلاس های استفاده نشده</title>
                <link>https://virgool.io/@espiar/%DA%A9%D9%85-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AD%D8%AC%D9%85-%D9%81%D8%A7%DB%8C%D9%84-%D9%86%D9%87%D8%A7%DB%8C%DB%8C-tailwindcss-%D8%A8%D9%87-%D8%B1%D9%88%D8%B4-%D8%AD%D8%B0%D9%81-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%86%D8%B4%D8%AF%D9%87-s914aw20a15t</link>
                <description>سلام ! عنوان کاملا گویا هست! قبلا در آخر مطلب زیر یک روش برای این کار گفتیم که توسط پلاگین purgecss برای postcss این کار انجام میشد و درست هم کار میکند: https://virgool.io/@espiar/%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-tailwindcss-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86-bootstrap-lvvopsgbwuv6 شخصی روش ساده تر ارائه داده است.حتما tailwindcss  به پروؤه اضافه شده و شما صفحات Html خودتون را طراحی کردین وحالا می خواهید حجم فایل نهایی css  کم کنید. برای اینکار ابتدا باید purgecss نصب کنید (در مطلب بالا نصب آن گفته شده).مرحله اولمانند مستندات در فایل tailwind.config.js رفته و کد زیر را بنویسید:// tailwind.config.js
module.exports = { 
     purge: [ 
           &#039;./src/**/*.html&#039;,
            &#039;./src/**/*.vue&#039;, 
           &#039;./src/**/*.jsx&#039;,
           ], 
     theme: {}, 
     variants: {},  
   plugins: [],
 }در کد بالا بجای &#x27;./src/**/*.html&#x27; باید آدرس جایی که صفحات html وجود دارد را قرار دهید و اگر فایل هایی مانند vue و یا jsx  هم داشتید آدرس آنها هم قرار دهید در غیر این صورت فقط آدرس  صفحات با پسوند هایی که دارید را قرار دهید. (تصویر این بخش در بخش مثال واقعی آورده شده)مرحله دوم ابتدا دستور زیر را اجرا کنید:npm install --save-dev cross-envبعد به فایل package.json و خط کد زیر را در بخش scripts اضافه کنید:&amp;quotproduction&amp;quot: &amp;quotcross-env NODE_ENV=production postcss assets/css/src/tailwind.css -o assets/css/dist/tailwind.min.css&amp;quotکد بالا فایل کامپایل شوند tailwind.css در آدرس assets/css/src/tailwind.css میگیره و خروجی کم حجم شده (کلاس های اضافه حذف شده) را در فایل tailwind.min.css در آدرس assets/css/src/tailwind.css -o assets/css/dist/tailwind.min.css قرار میدهد.نکته: نام گذاری tailwind.min.css اشتباه است زیرا فقط کلاس های اضافه را حذف میکند اما فضا های خالی و فشرده سازی را انجام نمیدهد (عملیات minifi را انجام نمیدهد اما ما پسوند .min. قرار داده ایم) پس نامگذاری درست انجام بدهید.مرحله سومبرای گرفتن خروجی نهایی و کم حجم شده فقط کافیست دستور زیر را در ترمینال vscode  بنویسید npm run productionتمام! خروجی را با نام فایل مورد نظر در آدرس مورد نظر می سازد.مثال واقعیفایل package.json&amp;quotscripts&amp;quot: {
    &amp;quotbuild&amp;quot: &amp;quotpostcss css/tailwind.css -o css/style.css&amp;quot,
    &amp;quotwatch&amp;quot: &amp;quotpostcss css/tailwind.css -o css/style.css --watch&amp;quot,
    &amp;quotproduction&amp;quot: &amp;quotcross-env NODE_ENV=production postcss css/tailwind.css -o css/style.min.css&amp;quot
},(آخرین تصویر این مطلب تصویر کلی از این فایل هست)به نحوه آدرس دهی و آدرس فایل ها در پروژه دقت کنیدنکته ای این روش در مقایسه با روشی که مطلب قبلی (لینکش در ابتدای همین مطلب آورده شده) وجود دارد اینکه روش قبلی چون از پلاگین purgecss  برای postcss استفاده می کردیم تنظیمات آن را مانند تصویر زیر در فایل postcss.config.js می نوشیتم:روش مطلب قبلیاما در این روش ما از فایل tailwind.config.js جهت تنظیمات و ستور را به صورت دستور ترمینال  در فایل package.json آوردیم:روش جدیدیادتان باشد که باز صفحه را از طریق minify کردن می توانید کم حجم تر کنید!منبع</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Tue, 12 May 2020 16:04:43 +0430</pubDate>
            </item>
                    <item>
                <title>فریمورک Tailwindcss  به همراه Pinegrow و دیگر هیچ !</title>
                <link>https://virgool.io/wptips/%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-tailwindcss-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-pinegrow-%D9%88-%D8%AF%DB%8C%DA%AF%D8%B1-%D9%87%DB%8C%DA%86-cwcmdysmzvxy</link>
                <description>خوب دوستان من قبلا در مورد ،Tailwindcss توضیح دادم : https://virgool.io/@espiar/%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-tailwindcss-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86-bootstrap-lvvopsgbwuv6  https://virgool.io/@espiar/%D9%86%DA%A9%D8%A7%D8%AA-%D8%B1%DB%8C%D8%B2-%D9%88-%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-tailwindcss-hjkwmmkywuzj  https://virgool.io/@espiar/%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D9%88%D9%86%D8%AA-%D8%AF%D9%84%D8%AE%D9%88%D8%A7%D9%87-%D8%AF%D8%B1-tailwindcss-vmeyrntmtmiv  https://virgool.io/@espiar/%DA%A9%D9%85-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AD%D8%AC%D9%85-%D9%81%D8%A7%DB%8C%D9%84-%D9%86%D9%87%D8%A7%DB%8C%DB%8C-tailwindcss-%D8%A8%D9%87-%D8%B1%D9%88%D8%B4-%D8%AD%D8%B0%D9%81-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%86%D8%B4%D8%AF%D9%87-s914aw20a15t اما pinegrow چیست؟این pinegrow نرم افزاری جهت طراحی آسان سایت به صورت ریسپانسیو برای Bootstrap, Foundation, AngularJS و WordPress است. با این برنامه به راحتی میتونید  با درگ/دراپ کردن عناصر مورد نظر به صورت زنده یا Live سایت خودتون رو طراحی و مشاهده کنید. pinegrow  تمام تلاشش رو کرده تا شما دست به کد نزنید ولی خب هر جایی نیاز باشه میتونید از طریق کد نویسی هم تغییرات مورد نظرتون رو اعمال کنید. در نهایت میتونید قالبتون رو به وردپرس نیز تبدیل کنید. اما به خاطر داشته باشید که این برنامه و سایر برنامه های مشابه تنها برای افراد مبتدی و نیازهای اولیه طراحی سایت طراحی شدن، این طور نیست که شما بتونید توسط این برنامه ها یک سایت کاملا حرفه ای و بهینه طراحی کنید و تمامی نیازهای شما رو پوشش بده. بهترین کاربرد این نرم افزارها یادگیری Html/CSS است یعنی به راحتی با تغییرات گرافیکی مختلف میتونید نتیجه اش رو در کد مشاهده کنید و به عملکردها تگها، صفات و ویژگی های مختلف پی ببرید.منبع و لینک دانلود.حتما با خواندن توضیح بالا متوجه شدید خبری از Tailwindcss نیست. بله درسته خبری نیست و از آن هم پشتیبانی نمیکند ! خوب شاید با دیدن تیتر این مطلب تعجب کنید &quot;فریمورک Tailwindcss  به همراه Pingegrow و دیگر هیچ !&quot; ولی تعجب نکنید. برای کار کردن با tailwindcss در نرم افزار pinegrow کافیست ابتدا tailwindcss را در محل پروژه نصب کنید (لینک اول: فریم ورک Tailwindcss جایگزین Bootstrap) خوب ما در نصب با vs code کار کردیم و با این ادیتو همچنان کار خواهیم کرد! در ادامه ما باید افزونه pinegrow را برای کار با  vs code  استفاده  کنیم که نام آن Pinegrow Live Sync است. همانطور که از اسمش پیداست کار این پلاگین برقراری ارتباط زنده و مستقیم بین vs code و pinegrow است.نکات کلیدی تا اینجا گفتیم نصب tailwindcss در محل پروژه و نصب پلاگین pinegrow برای vscode.حالا مانده تنظیمات پلاگین و خود نرم افزار pinegrow. این نکته را درنظر بگیرید که اگر تغییر در نرم افزار pinegrow ندهید نیازی به تغییر تنظیمات پلاگین نیست!.تنظیمات نرم افزار pinegrowبرای رفتن به تنظیمات باید مانند تصویر زیر عمل کنید:تنظیمات پیشفرضتنظیمات پیشفرض host روی لوکال هاست هست و پورت 40000. اگر به هر دلیلی این تنظیمات را تغییر داد باید حتما مراحل بعدی را طی کنید.مرحله بعدی باید آدرس هاست و پورت این نرم افزار رو پیدا کنیم برای این کار به آدرس زیر میرویم:با رفتن به آدرس بالا پنجره زیر باز میشود که در آن آدرس نوشته شده است:اگر هاست و پورت را تغییر داده باشید آدرس بالا تغییر میکند.آدرس بالا را کپی کنید (در تصویر آدرس http://localhost:40000 می بینید)در اینجا کار ما با تنظیمات نرم افزار تمام شد! حالا به تنظیمات افزونه vscode  میرویم.تنظیمات vs codeبه آدرس زیر می رویم:در سرچ بار پنجره تنظیمات pinegrow تایپ کرده و آدرس که قبلا کپی کردیم را در آن قرار می دهیم:و تمام !حال vs code  و pinegrow را باز کرده خواهید دید به هم دیگر ارتباط زنده دو طرفه برقرار میکنند. هر تغییری در کد ها در نرم افزار pinegrow و هر تغییری در نرم افزار pinegrow در vs code هم رخ میدهد! زیبا نیست ؟ حالا ما میتوانیم از قدرت هر دو استفاده کنیم.نحوه استفاده:نکته بسیار مهمی که وجود دارد این است که باید قابلیت Auto Save  در vs code  خاموش باشد!ابتدا هر دو نرم افزار را اجرا کرده تا با یکدیگر وصل شوند سپس صفحه html مورد نظر را در vs code (میسازیم و) باز می کنیم و بعد  روی آن راست کلیک کرده و گزینه pinegrow: Open file  انتخاب کنید.حالا صفحه شما در نرم افزار pinegrow نیز نمایان میشود!دو گزینه دیگر هم وجود دارد که عبارتند از:رفرش کردن صفحه در نرم افزار pinegrow: Refresh pageو انتخاب المنت در نرم افزار pinegrow: select elementهمچنین اگر در نرم افزار المنتی را انتخاب و یا تغییر دهید به صورت زنده در vs code این تغییر(ها) اتفاق می افتد!و به عنوان کلام آخر مزیت اصلی و مهمی که ابتدا من رو به این نرم افزار هدایت کرد این بود که می توان بطور همزمان صفحه را در سایزهای مختلف به تماشا کرد. این قابلیت بخصوص اگر چند مانیتور داشته باشید (و یا یک مانیتور ultra wide)  خودش را بیشتر نشان می دهد و طراحی همزمان برای چند دستگاه براحتی میتوان انجام داد.این هم یک لینک یوتیوب برای تنظیم vs code و  نرم افزار pinegrowنمایش صفحه html در سایز های مختلف</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Mon, 11 May 2020 16:12:30 +0430</pubDate>
            </item>
                    <item>
                <title>ایجاد و مدیریت Event ها</title>
                <link>https://virgool.io/@espiar/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%88-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-event-%D9%87%D8%A7-z30tzovdlfy9</link>
                <description>Handling and raising eventsاین مطلب پیرو مطلب قبلیست https://virgool.io/@espiar/callback-%DA%86%DB%8C%D8%B3%D8%AA-%D9%86%D8%AD%D9%88%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A2%D9%86-%D8%AF%D8%B1-c-ofudiayf1wkr رویدادها(Events) در .NET براساس مدل نماینده(delegate) است. مدل delegate از observer design pattern (الگوی طراحی ناظر) پیروی می کند ، که یک مشترک (subscriber) را قادر می سازد تا  در یک Provider ثبت شده و notification ها را دریافت کند. یک فرستنده رویداد (event sender) یک notification ارسال میکند که بیان کننده یک event اتفاق افتاده است، و یک گیرنده رویداد (event receiver) که notification را دریافت کرده و پاسخی راجع به آن تعریف میکند.در این مقاله به تشریح مؤلفه های اصلی مدل نماینده ، نحوه استفاده رویدادها در برنامه ها و چگونگی پیاده سازی رویدادها در کد خود می پردازیم.رویداد ها Eventsیک event ، یک پیام است که توسط یک شی برای اطلاع از وقوع یک عمل (یک action) ارسال می شود.این action می تواند ناشی از تعامل کاربر باشد ، مانند کلیک دکمه ، یا می تواند ناشی از برخی از منطق برنامه دیگر باشد ، از جمله تغییر value یک property. ابزاری که رویداد را raises (به آن fire هم می گویند - کلا به معنی اجرا کردن) می کند ، فرستنده رویداد یا event sender نامیده می شود.فرستنده رویداد نمی داند که چه شیء یا متد رویدادهای raise شده را دریافت خواهد کرد(مدیریت خواهد کرد).این رویداد به طور معمول عضو فرستنده رویداد است. به عنوان مثال ، رویداد Click عضو کلاس Button است و رویداد PropertChanged عضو کلاسی است که واسط INotifyPropertyChanged را پیاده سازی می کند.برای تعریف یک رویداد ،شما از کلمه کلید  event  استفاده می کنید و نوع delegate را برای این رویداد مشخص می کنید.به طور معمول ، برای ایجاد یک رویداد ، methodی را اضافه می کنید که به عنوان Protected و virtual مشخص شده است.این متد را OnEventName بنویسید؛ به عنوان مثال ، OnDataReceived.این method باید از یک پارامتر استفاده کند که یک شیء از داده های رویداد را مشخص کند ، این یک شیء از نوع EventArgs یا یک نوع مشتق شده از آن است. با فراهم کردن این متد این قابلیت را فراهم میکند تا کلاسهای مشتق شده بتوانند منطق خود را  برای raise کردن رویداد، override کنند. یک کلاس مشتق شده باید همیشه از متد OnEventName کلاس پایه را صدا بزند تا اطمینان حاصل شود که delegateهای ثبت شده این رویداد را دریافت می کنند.مثال زیر نشان می دهد که چگونه رویدادی به نام ThresholdReached را تعریف کنیم. این رویداد با نماینده EventHandler همراه است و با متدی به نام OnThresholdReached را raise کرده است.class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}نکته: البته در نظرات گفته شده برای کوتاه کردن کد میتوان بجایEventHandler handler = ThresholdReached; 
handler?.Invoke(this, e);از کد زیر استفاده کردThresholdReached?.Invoke(this, e);نمایندگان Delegatesیک delegate یک type است که ارجاع به یک متد در خود نگهداری میکند. یک delegate با امضایی تعریف می شود که نوع بازگشتی و پارامترهایی را برای متدهایی که ارجاع می دهد نشان می دهد و می تواند تنها به متدهایی که با امضای آن مطابقت دارند ، مراجعه کند.بدین ترتیب یک delegate معادل یک type-safe function pointer  یا یک callback است. یک delegate برای تعریف کلاس delegate کافی است.نمایندها کاربردهای زیادی در دات نت دارند. در متن eventها ، یک delegate واسطه (یا مکانیسم شبیه به pointer) بین منبع event و کدی است که از آن event استفاده می کند. با ذکر نوع delegate در تعریف event  شما یک delegate را با یک event مرتبط می کنید،همانطور که در مثال قبلی نشان داده شده است.برای کسب اطلاعات بیشتر در مورد نمایندها ، به کلاس Delegate مراجعه کنید.دات نت .NET نمایندهای EventHandler و EventHandler&lt;TEventArgs&gt; (لینکش طبق معمول مشکل ویرگول) را برای پشتیبانی از بیشتر سناریوهای رویداد فراهم می کرده است. از نماینده EventHandler برای همه رویدادهایی که شامل داده های رویداد نیستند استفاده کنید. برای رویدادهایی که شامل داده های مربوط به رویداد هستند از نماینده EventHandler&lt;TEventArgs&gt; استفاده کنید.این delegateها هیچ مقدار از نوع برگشتی ندارند و دو پارامتر (یک شی برای منبع رویداد و یک شی برای داده های رویداد) را می گیرند.نمایندها multicast (چند مرحله ای) هستند ، به این معنی که آنها می توانند ارجاعات بیش از یک متد ادراه کننده رویدادها (event-handling method) نگهداری کنند.برای جزئیات بیشتر ، به صفحه Delegate مراجعه کنید. Delegateها انعطاف پذیری و کنترل fine-grained را در اداره کردن رویدادها فراهم می کنند. یک delegate مانند یک ارسال کننده رویداد برای کلاس عمل می کند که با حفظ لیستی از event handlers ثبت شده برای این رویداد ، رویداد را raise می کند.برای سناریوهایی که نمایندهای EventHandler وEventHandler&lt;TEventArgs&gt; کار نمی کنند ، می توانید یک delegate تعریف کنید. سناریوهایی که شما را برای تعریف delegate مجبور می کنند بسیار نادر هستند ، مانند زمانی که شما باید با کدی کار کنید که genericها را تشخیص نمی دهد .شما از  کلمه کلیدی delegate برای علامت گذاری  در تعریف نماینده استفاده می کنید. مثال زیر نحوه تعریف delegateی به نام ThresholdReachedEventHandler را نشان می دهد.public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);داده های رویداد Event dataداده های مرتبط با یک رویداد را می توان از طریق یک کلاس داده رویداد (event data class) ارائه داد. دات نت کلاس های بسیاری از داده های رویداد را ارائه می دهد که می توانید در برنامه های خود استفاده کنید.به عنوان مثال ، کلاس SerialDataReceivedEventArgs کلاس داده های رویداد، برای رویداد SerialPort.DataReceived است. .NET از الگوی نامگذاری پایان دادن به همه کلاسهای داده رویداد با EventArgs پیروی می کند (در پایان نام کلمه EventArgs  می آید). با نگاه کردن به delegate برای این event، تعیین می کنید که کدام event data class با یک event مرتبط است. به عنوان مثال ، نماینده SerialDataReceivedEventHandler شامل کلاس SerialDataReceivedEventArgs به عنوان یکی از پارامترهای آن است.کلاس EventArgs نوع پایه ای برای همه event data classها است.  وقتی یک رویداد هیچ data ای ندارد کلاس EventArgs  همچنان مورد استفاده قرار میگیرد. وقتی رویدادی را ایجاد می کنید که فقط به کلاس های دیگر اطلاع دهد که اتفاقی افتاده است و نیازی به ارسال(پاس دادن) داده ها نیست ، کلاس EventArgs را به عنوان دومین پارامتر در delegate وارد کنید. وقتی اطلاعاتی در دسترس نباشد می توانید مقدار EventArgs.Empty را تعیین کنید. نماینده EventHandler شامل کلاس EventArgs به عنوان یک پارامتر است. (در کل EventArgs اجباریست)هنگامی که می خواهید یک event data class سفارشی ایجاد کنید ، یک کلاس ایجاد کنید که از EventArgs مشتق شود ، و سپس اعضای مورد نیاز برای ارسال(پاس دادن) داده هایی را که مربوط به رویداد است ، تهیه کنید.به طور معمول ، شما باید از همان الگوی نامگذاری  .NET استفاده کرده و نام event data class خود را با EventArgs پایان دهید.مثال زیر event data class را با نام ThresholdReachedEventArgs نشان می دهد. این شامل پراپرتی های خاص برای رویداد raise شده است.public class ThresholdReachedEventArgs : EventArgs
{
    public int Threshold { get; set; }
    public DateTime TimeReached { get; set; }
}مدیریت کننده رویداد Event handlersبرای پاسخ به یک رویداد ، شما یک متد مدیریت کننده رویداد را در گیرنده رویداد تعریف می کنید.این متد باید با امضای نماینده برای رویدادی که انجام می دهد مطابقت داشته باشد.در قسمت مدیریت رویداد(event handler) ، اقدامات موردنیاز هنگامی که رویداد raise شده است ،را انجام می دهید، مانند جمع آوری ورودی کاربر پس از کلیک کاربر روی یک دکمه. برای دریافت notification ها هنگام وقوع این رویداد ، متد event handler شما باید در این رویداد subscribe (مشترک) شوید.مثال زیر یک event handler method به نام c_ThresholdReached را نشان می دهد که با امضای نماینده EventHandler مطابقت دارد. این متد در رویداد ThresholdReached مشترک (subscribe) است.class Program
{
    static void Main()
    {
        var c = new Counter();
        c.ThresholdReached += c_ThresholdReached;

        // provide remaining implementation for the class
    }

    static void c_ThresholdReached(object sender, EventArgs e)
    {
        Console.WriteLine(&amp;quotThe threshold was reached.&amp;quot);
    }
}مدیریت کننده رویداد  استاتیک و داینامیک Static and dynamic event handlersدات نت به مشترکین(subscribers) اجازه می دهد تا  event notificationها را بصورت ایستا (statically) یا پویا(dynamically) ثبت کنند. Static event handlerها در واقع برای کل عمر کلاس که مدیریت رویدادهای آنها را بر عهده دارد ، تأثیر دارند. Dynamic event handlers معمولاً در پاسخ به برخی از منطق برنامه های شرطی ، به صراحت هنگام اجرای برنامه فعال و غیرفعال می شوند. به عنوان مثال ،آنها می توانند در صورت نیاز به event notificationها فقط در شرایط خاص مورد استفاده قرار گیرند یا اگر یک برنامه (application) چندین event handler را در اختیار شما قرار می دهد و شرایط زمان اجرا(run-time) مناسب را برای استفاده تعریف می کند. در مثال بخش قبلی نحوه اضافه کردن یک dynamically event handler را نشان می دهد. اطلاعات بیشتر Events.رایزکردن چندین رویداد Raising multiple eventsاگر کلاس شما چندین رویداد را raise کند ، کامپایلر برای هر نمونه event delegate یک field ایجاد می کند. اگر تعداد رویدادها زیاد باشد ، ممکن است هزینه ذخیره یک field در هر نماینده قابل قبول نباشد.برای چنین شرایطی دات نت event propertyها را فراهم می کند که می توانید با استفاده از ساختار داده دیگری به انتخاب خود برای ذخیره event delegateها استفاده کنید.(خصوصیات رویداد) event delegateها شامل تعاریف event همراه با event accessor است. event accessorها متدهایی هستند که برای اضافه کردن یا حذف نمونه های event delegate از ساختار داده ذخیره سازی تعریف می کنید.توجه داشته باشید که event propertyها از event fieldها آهسته تر است ، زیرا باید هر event delegate قبل از invoke شدن به آن بازیابی شود.مبادله بین حافظه و سرعت است. اگر کلاس شما رویدادهای بسیاری را  تعریف کرده که به ندرت raise میشوند ، می خواهید event propertyها را پیاده سازی کنید.برای اطلاعات بیشتر ، به نحوه مدیریت: چندین رویداد با استفاده از ویژگی های رویداد مراجعه کنید.آموزش های مرتبطچگونه رویداد ها را raise و استفاده کنیم:حاوی نمونه هایی از raise و استفاده رویدادها است.چگونه چندین رویداد را مدیریت کرده و از خصوصیات رویداد استفاده کنیم: نحوه استفاده از ویژگی های رویداد برای انجام چندین رویداد را نشان می دهد.الگوی طراحی Observer : الگوی طراحی را توصیف می کند که مشترک را قادر می سازد از ارائه دهنده ثبت کند و notification هایی را دریافت کند.استفاده رویداد ها در web forms : نحوه اداره رویدادی را که توسط یک کنترل وب فرم ایجاد شده است نشان می دهد.منبع</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Sat, 02 May 2020 14:38:16 +0430</pubDate>
            </item>
                    <item>
                <title>callback  چیست نحوه ساخت آن در C#</title>
                <link>https://virgool.io/@espiar/callback-%DA%86%DB%8C%D8%B3%D8%AA-%D9%86%D8%AD%D9%88%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A2%D9%86-%D8%AF%D8%B1-c-ofudiayf1wkr</link>
                <description>بیایید ابتدا به مفهوم callback بپردازیم: در برنامه نویسی کامپیوتر callback کد اجرایی است که به عنوان argument به کد دیگر منتقل شده است.سی شارپ برای این منظور  delegates (نمایندگان) دارد. آنها به شدت با events (رویدادها) مورد استفاده قرار می گیرند ، زیرا یک رویداد می تواند به طور خودکار تعدادی از delegates (نمایندگان) پیوست شده (event handlers) را فراخوانی کند.در واقع یک callback ، (نشانگر) pointer کد اجرایی است که به عنوان آرگومان (argument) به کد های دیگر منتقل می شود.یک مثال برای درک بهتر در دنیای واقعی:من فقط شما را ملاقات کردم ، و این دیوانه است ، اما در اینجا شماره من (delegate) است ، بنابراین اگر اتفاقی رخ دهد (event) ، با من تماس بگیرید ، شاید (callback)؟آهنگ Carly Rae Jepsen ?I just met you,And this is crazy,But here&#x27;s my number (delegate),So if something happens (event),Call me, maybe (callback)?استفاده از callback معمولاً در منطق ناهمزمان (asynchronous) است.برای ایجاد callback در C# ، باید  آدرس یک function را درون یک متغیر ذخیره کنید. برای رسیدن به این منظور، استفاده از یک delegate (نماینده) یا استفاده از lambda به صورت Func یا Action حاصل می شود.public delegate void WorkCompletedCallBack(string result);

    public void DoWork(WorkCompletedCallBack callback)
    {
        callback(&amp;quotHello world&amp;quot);
    }

    public void Test()
    {
        WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
        DoWork(callback);
    }

    public void TestCallBack(string result)
    {
        Console.WriteLine(result);
    }امروزه در C# ، این کار با استفاده از لامبدا مانند زیر انجام میدهند:public void DoWork(Action&lt;string&gt; callback)
    {
        callback(&amp;quotHello world&amp;quot);
    }

    public void Test()
    {
        DoWork((result) =&gt; Console.WriteLine(result));
    }منبع</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Fri, 01 May 2020 17:12:42 +0430</pubDate>
            </item>
                    <item>
                <title>اهداف الگوهای طراحی</title>
                <link>https://virgool.io/coderlife/%D8%A7%D9%87%D8%AF%D8%A7%D9%81-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-qymub6od22qc</link>
                <description>مقدمه: اینجا فقط به هدف هر الگو و اینکه این الگو چه مسئله ای را حل میکند می پردازم. و ببینید در حال حاضر مشکلی که داریم با کدام الگو می توان حل کرد (خوراندن یک الگو به مشکل ممنوع)الگو های ساختاری Structuralاین الگوها به روابط و تعامل بین اشیا و ترکیب شدن آنها با یکدیگر برای شکل دادن سازه ها و اشیا پیچیده تر تمرکز دارند.این نوع الگوها می توانند هنگام طراحی یا پس از آن در حین نگهداری و توسعه استفاده شوند.DecoratorProxyBridgeCompositeFlyweightAdapterFacadeهدف الگوی Decorator :افزودن وضعیت یا رفتار جدید به طور پویا به اشیا.این بار مثال را با شیرینی و کیک پیش می‌بریم.فرض کنید شما قصد پخت کیک و نان را دارید. طبیعی است که برای اینکار یک واسط را تعریف کرده و عمل «پختن» را در آن اعلام می‌کنید تا هر کلاسی که قصد پیاده سازی این واسط را داشت، «پختن» را انجام دهد. در ادامه یک کلاس بنام کیک ایجاد خواهید کرد و شروع به پخت آن می‌کنید.خوب احتمالا الان کیک آماده‌است و می‌توانید آن‌را میل کنید! ولی یک سؤال. تکلیف شخصی که کیک با روکش کاکائو دوست دارد و شمایی که کیک با روکش میوه‌ای دوست دارید چیست؟ این را چطور در پخت اعمال کنیم؟ یا منی که نان کنجدی می‌خواهم و شمایی که نان برشته‌ی غیر کنجدی می‌خواهید چطور؟احتمالا می‌خواهید سراغ ارث بری رفته و سناریوهای این چنینی را پیاده سازی کنید. ولی در مورد ارث بری، اگر کلاس sealed (NotInheritable) باشه چطور؟احتمالا همین دو تا سؤال کافی‌است تا در پاسخ بگوئیم، گره‌ی کار، با الگوی Decorator باز می‌شود و همین دو تا سؤال کافی‌است تا اعلام کنیم که این الگو، از جمله الگوهای بسیار مهم و پرکاربرد است. ادامهبه عنوان مثال تصویر زیر را در نظر بگیرید. روش های متعددی برای اضافه کردن یک موجودیت یا صفت جدید به یک تصویر وجود دارد، به عنوان نمونه، اضافه کردن حاشیه به اطراف آن، و یا اضافه کردن تگ مرتبط با متن تصویر به آن. چنین مواردی که به تصویر اضافه می شوند، می توانند در بالا با پایین آن نمایش داده شوند. ادامهبیشترهدف الگوی Proxy :استفاده از یک شی واسطه به منظور جلوگیری از دسترسی مستقیم به شی اصلی و متمرکز سازی کنترل دسترسی.همه کاربران کامپیوتر در ایران به خوبی با کلمه پروکسی آشنا هستند. پروکسی به معنی نماینده یا واسط است و پروکسی واسطی است بین ما و شیء اصلی. پروکسی در شبکه به این معنی است که سیستم شما به یک سیستم واسط متصل شده است که از طریق پروکسی محدودیت‌های دسترسی برای آن تعریف شود. در اینجا هم پروکسی در واقع به همین منظور استفاده می‌شود. ادامههدف الگوی Bridgeجدا کردن انتزاع و پیاده سازی از یکدیگر به منظور اینکه بتوان هرکدام را بطور مستقل از دیگری توسعه داد.سناریو زیر را در نظر بگیرید:قصد دارید تا در برنامه‌ی خود ارسال پیام از طریق پیامک و ایمیل را راه اندازی کنید. هر کدام از این روش‌ها نیز برای خود راه‌های متفاوتی دارند. برای مثال ارسال پیامک از طریق وب سرویس یا یک API خارجی و غیره.کاری را که می‌توان انجام داد، بشرح زیر نیز می‌توان بیان نمود:ابتدا یک Interface ایجاد می‌کنیم (IBridge) و در آن متد Send را قرار می‌دهیم. این متد یک پارامتر ورودی از نوع رشته می‌گیرد و به کمک آن میتوان اقدام به ارسال پیامک یا ایمیل یا هر چیز دیگری نمود. کلاس‌هایی این واسط را پیاده سازی می‌کنند که یکی از روش‌های اجرای کار باشند (برای مثال کلاس WebService که یک روش ارسال پیامک یا ایمیل است). ادامهیکی از مهمترین کاربرد های الگوی طراحی Bridge زمانی است که نسخه جدیدی از یک نرم افزار متولد می شود که قرار است جایگزین نسخه قدیمی آن شود و قرار هست که نسخه قدیمی این نرم افزار نیز به همان قدرت قبلی به کار خود ادامه دهد. تا مشتریان قبلی بتوانند همچنان از نرم افزار خریداری شده خود استفاده کنند. کد برنامه نیازی ندارد تا تغییر کند، زیرا ساختار کد به دلیل تطابق با انتزاع (Abstraction) موجود مشخص است، ولی استفاده کننده خود باید مشخص کند که از کدام نسخه می خواهد در برنامه استفاده کند. ادامهبیشترهدف الگوی Compositeتعریف ساختار اشیایی که interface مشابهی داشته باشند و بتوانند درختواره ای سلسله مراتبی ایجاد کرد.برای مثال، ساختار کارمندان یک سازمان را در نظر بگیرید. در این ساختار رئیس یا CEO در راس این درخت قرار دارد و در ادامه دسته ای از مدیران، کارفرمایان و سپس کارمندان جزء.در صورتی که CEO، مدیران، کارفرمایان اشیاء مرکب ای باشند که زیردستان خود را مدیریت می کنند، آنگاه کارمندان یا کارمندان جزء اشیاء منفردی هستند که در این ساختار درختی به صورت برگ ظاهر می شوند.به عنوان یک مثال دیگر، ساختار file های کامپیوتر در نظر بگیرید. این ساختار سلسله مراتبی از پوشه ی ریشه شروع می شود تا به آخرین فایل های ممکن برسد. ادامهبیشترهدف الگوی Flyweightفاکتورگیری از اشیا تکراری و صرفه جویی در مصرف حافظه.سناریوی زیر را در نظر بگیرید:فرض کنید از شما خواسته شده است تا یک پردازشگر متن را بنویسید. خوب در این پردازشگر با یک‌سری کاراکتر روبرو هستید که هر کاراکتر احتمالا آبجکتی از نوع کلاس خود می‌باشد؛ برای مثال آبجکت XYZ که آبجکتی از نوع کلاس A هست و برای نمایش کاراکتر A استفاده می‌شود. این آبجکت‌ها دارای دو دسته خصیصه هستند: (مطالعه بیشتر )خصیصه‌های ثابت: یعنی همه کاراکترهای A دارای یک شکل مشخص هستند. در واقع مشخصات ذاتی آبجکت می‌باشند.خصیصه‌های پویا: یعنی هر کاراکتر دارای فونت، سایز و رنگ خاص خود است. در واقع خصیصه‌هایی که از یک آبجکت به آبجکت دیگر متفاوت هستند .خوب احتمالا در ساده‌ترین راه حل، به ازای تک تک کاراکترهایی که کاربر وارد می‌کند، یک آبجکت از نوع کلاس متناسب با آن ساخته می‌شود. ولی بحث مهم این است که با این همه آبجکت که هر یک مصرف خود را از حافظه دارند، می‌خواهید چکار کنید؟ احتمالا به مشکل حافظه برخورد خواهید کرد! پس باید یک سناریوی بهتر ایجاد کرد.سناریوی پیشنهادی این است که برای هر نوع کاراکتر، یک کلاس داشته باشیم، همانند قبل(یک کلاس برای A یک کلاس برای B و غیره) و یک استخر پر از آبجکت داشته باشیم که آبجکت‌های ایجاد شده در آن ذخیره شوند.سپس کاربر، کاراکتر A را درخواست می‌کند. ابتدا به این استخر نگاه می‌کنیم. اگر کاراکتر A موجود بود، آن را برمی‌گردانیم و اگر موجود نبود، یک آبجکت از نوع A می‌سازیم، سپس این آبجکت را در استخر ذخیره می‌کنیم و آبجکت را بر می‌گردانیم. در این صورت اگر کاربر دوباره درخواست A را کرد، دیگر نیازی به ساخت آبجکت جدید نیست و از آبجکت قبلی می‌توانیم استفاده نماییم. با این شرایط تکلیف خصایص ایستا مشخص است. ولی مشکل مهم با خصایص پویا این است که می‌توانند بین آبجکت‌ها متفاوت باشند که برای این هم یک متد در کلاس‌ها قرار می‌دهیم تا این خصایص را تنظیم نماید. ادامهبیشترهدف الگوی Adapterفراهم کردن امکان استفاده از کلاسی با interface ناهمگون در یک برنامه ی دیگر.از الگوی Adapter برای ادغام شدن با یکسری اجزاء خارجی استفاده می شود که این اجزاء از نظر عملکرد یکسان هستند و فقط نحوه فراخوانی توابعشان کمی با هم فرق دارند. فرض کنید یک کلاس Employee با یک متد PrintEmployee داریم و قرار است با یک کلاس ارائه دهنده کارمند قراردادی با نام EmployeeDetail و یک تابع با نام ListEmployee تعامل داشته باشد.در این مثال می توانیم یک کلاس adapter (تطبیقی) بسازیم که کلاس خارجی EmployeeDetail را بپوشاند. بنابراین فراخوانی متد PrintEmployee() در adapter به متد ListEmployee() کلاس خارجی واگذار (Delegate) می شود. ادامهاز الگوهای ساختاری برای ترکیب کلاسها و اشیاء (Objects)،در جهت ایجاد ساختارهای بزرگتر استفاده می‌شود.به بیان ساده‌تر الگوهای ساختاری با ترکیب کلاسها و آبجکتها،قابلیت‌های کلاسهای غیر مرتبط را در قالب یک Interface(منظور ظاهر) در اختیار Client (منظور کلاس یا متد استفاده کننده می‌باشد) قرار می‌دهند.الگوهای ساختاری با استفاده از ارث بری به ترکیب Interfaceها پرداخته و آنها را پیاده سازی می‌نمایند.استفاده از الگوهای ساختاری برای توسعه کتابخانه هایی (Library) که مستقل از یکدیگر می‌باشند،اما در کنار هم مورد استفاده قرار می‌گیرند،بسیار مفید است. ادامهبیشترهدف الگوی Facadeخلاصه سازی، ساده سازی و متمرکزسازی interface  یک سیستم شلوغ و پیچیده متشکل از تعداد زیادی کلاس و زیر سیستم به یک interface سبک ، ساده و سطح بالا.این الگو یک کلاس یا یک سیستمی را با متدها و رویدادهایی ساده، در اختیار ما قرار می‌دهد و در یک لحظه، تنها با یک کلاس واحد سر و کله می‌زنیم. احتمالا بسیاری از شما از این الگو استفاده کرده‌اید، ولی شاید با اسم آن آشنا نبوده‌اید.کار این کلاس در واقع ترکیب کلاس‌ها و کتابخانه‌های کاری مشخص است که نیاز به ارتباط با یکدیگر را دارند. به عنوان مثال یک برنامه کتابخانه، برای وظیفه‌ای چون امانت یک کتاب نیاز است تا چندین کلاس مختلف را با یکدیگر به کار بگیرد که این وظایف شامل موارد زیر می‌باشند:1- بررسی وجود کتاب2- بررسی تعداد موجود یک کتاب در کتابخانه3- بررسی وضعیت امانی کتاب (آیا کتاب در دست کسی از قبل امانت است؟ یا کتاب برای امانت آزاد است؟)4- در صورتی که کتابی بیش از زمان مورد نظر در دست کسی امانت است، با یک پیامک از او بخواهیم که کتاب را بازگرداند.تمامی موارد بالا تنها قسمتی از انجام یک عمل ساده هستند که در یک گروه جای می‌گیرند؛ ولی در واقع از چندین کلاس جدا مثل کلاس کتاب، امانت، سیستم پیامکی و ... استفاده شده است . الگوی Facade به ما کمک می‌کند تا پیچیدگی و تعداد خطوط اجرا را در سطوح بالاتر مخفی سازیم و تنها با صدا زدن یک یا چند متد ساده، کار را به اتمام برسانیم. این کار باعث کاهش کد و خوانایی برنامه در سطوح بالاتر می‌شود.بیشترالگو های ایجادی Creational این الگوهای به ساختار اشیا و ارجاع به آنها پرداخته و با انتزاعی کردن روند نمونه سازی از کلاس ها، مسئولیت این کار را خودشان بر عهده میگیرند. یعنی دیگر نیازی نیست کلاینت، خودش به طور صریح از یک کلاس نمونه سازی کند. این الگوها اتصال بین کلاس ها را ضعیف کرده و loose coupling (اتصال سست) را ترویج میدهند و با متمرکزسازی مسئولیت ایجاد اشیا پیچیده در یک نقطه ی متمرکز، پایبندی به اصول SRP و SoC را فراهم میکنند. https://virgool.io/@espiar/%D8%A7%D8%B5%D9%88%D9%84-solid-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D9%88-%D8%AE%D9%84%D8%A7%D8%B5%D9%87-jglgxrpgdqhf  https://virgool.io/@espiar/%D8%A7%D8%B5%D9%88%D9%84-solid-%D8%AF%D8%B1-clean-code-%D9%82%D8%B3%D9%85%D8%AA6-iarbkbnyerp8 هدف این الگو ها این است که یک سیستم را از چگونگی ساخت، تشکیل و ارائه ی اشیایشان جدا کنند. این الگو ها انعطاف پذیری سیستم را از نظر این که چه کسی،چگونه و چه هنگام، فلان شی را ایجاد میکند افزایش میدهد. الگو های ایجادی Creational دانش این که چه کلاس هایی توسط سیستم استفاده میشود را کپسوله کرده و جزییات نمونه سازی از آنها را پنهان میکنند.مطلب مهمی که باید درک کنید این است که یک سیستم بر اساس وراثت و نمونه سازی مستقیم از کلاس ها باعث سفت و سخت شدن سیستم و افزایش tight coupling  (ارتباط محکم و نزدیک-اتصال سفت) میشود. هدف این الگوها این است که این اتصال قوی و نزدیک (close coupling) را بشکنند.PrototypeFactory MethodSingletonAbstract FactoryBuilderهدف الگوی Prototypeسرعت بخشیدن به روند نمونه سازی و ایجاد اشیا با کپی سازی از نمونه های از پیش موجود.فرض کنید در حال پختن یک کیک هستید. ابتدا کیک را می‌پذید و سپس آن را تزیین می‌کنید. عملیات پختن کیک، فرآیند ثابتی است و تزیین کردن آن متفاوت. گاهی کیک را با کاکائو تزیین می‌کنید و گاهی با میوه و غیره. ادامهالگوی طراحی ای است که اشیاء را مجبور می کند تا در زمان ساخت، کپی یا شبیه سازی شوند.آیا کپی شی هم مهم است؟جواب ساده است. زمانی که اشیاء زیادی برای کار کردن نیاز باشد و ساخت آنها بسیار هزینه بر باشد، کپی کردن آنها می تواند به بهبود کارایی کمک کند.ادامهنمونه‌های اولیه برای انجام آزمایش‌های مختلف قبل از شروع تولید انبوه محصولات استفاده می‌شوند. اما در این الگوی طراحی، نمونه‌های اولیه به منظور انجام آزمایشات مختلف یا کنترل کیفیت استفاده نمی‌شوند. نمونه‌های ساخته شده در این تکنیک به صورت مستقیم در بخش‌های مورد نیاز در نرم افزار استفاده می‌شوند. بنابراین، تقریبا بهترین مثال از این الگوی طراحی در دنیای واقعی فرآیند تقسیم سلولی است.تصور کنید که یک کلاس به اسم سلول (Cell) در نرم افزار تعریف شود. برای اینکه این سلول به یک موجود تکامل یافته تبدیل شود، نیاز به تکثیر و نمونه سازی دارد. بنابراین به هزاران یا میلیون‌ها شی از این کلاس نیاز خواهیم داشت تا اندام‌های مختلف یک موجود زنده را تشکیل دهند و هر کدام به وظیفه خاص خود بپردازد. حال تصور کنید، اگر می‌خواستید همه این اشیا را به صورت مستقیم و یک به یک بسازید و پارامترهای آن‌ها را مقدار دهی کنید، چه میزان از زمان شما مصرف می‌شد.بر این اساس بهترین راه برای انجام این کار، به کارگیری الگوی طراحی پروتوتایپ خواهد بود. زیرا در این الگو سلول‌ها بر اساس سلول اولیه کپی خواهند شد و دیگر نیازی به ساخته شدن سلول‌ها و مقدار دهی پارامترهای آن‌ها بر اساس سلول اولیه به صورت یک به یک نخواهد بود. با توجه به این نکته که در فرآیند تقسیم سلولی، سلول‌های جدید از سلول اولیه ایجاد می‌شوند می‌توان اینگونه گفت که سلول اصلی به عنوان یک نمونه اولیه یا Prototype عمل می‌کند. ادامهبیشترهدف الگوی Factory Methodمتمرکزسازی نمونه سازی از کلاس های مشابه و کاهش اتصال مستقیم به محصول.اگر یک میوه فروشی موجود باشد که در کل روزهای سال میوه آوکادو می فروشد. این میوه فروشی باید مطمئن باشد که می تواند در طول سال می تواند این میوه را از کشاورزان تهیه نماید. این میوه فروشی باید از نواحی و کشورهای مختلف این میوه را در طول سال خریده و در داخل فروشگاه عرضه نماید. این میوه در کشورهای اسپانیا، آفریقای جنوبی و کنیان در فصل های متفاوتی رشد می کند. الگوی Factory Method شبیه به این میوه فروشی عمل می کند.اگر هرکدام از کشورهای تولید کننده آوکادو را به عنوان یک کلاس در نظر بگیریم و هرکدام اینترفیس IProduct را پیاده سازی می کند. بنابراین این کشورها می توانند آوکادو برای میوه فروشی فراهم کنند. ادامهبیشترهدف الگوی Singletonتعریف کلاسی که در سرتاسر برنامه تنها یک نمونه از آن بتوان ایجاد کرد.خیلی وقت ها نیاز است که فقط یک نمونه از یک کلاس ساخته شود. مثلاً وقتی که نمی خواهیم وضعیت شی تغییر کند و یا می خواهیم class را به صورت stateless نگه داریم.و به دلایل مختلفی نباید از کلاس های static استفاده کنیم. برخی از این دلایل عبارتند از:1- موارد مختلفی هست هست که می خواهید Interface ها را در یک کلاس پیاده سازی کنید (برای مثال پیاده سازی IOC) و به جای پیاده سازی کلاس به صورت static، آن را به صورت Singleton پیاده سازی می کنیم.2- در صورت نیاز، می توانید از یک کلاس singleton به صورت پارامتر یک متد استفاده کنید در حالی که نمی توان این کار را با کلاس static انجام داد.ادامهبیشترهدف الگوی Abstract Factoryتعریف ساختار یک کلاس Factory و تعدادی محصول به شکل انتزاعی به گونه ای که Factoryهای مختلف مطابق آن بتوانند خانواده ای از محصول های متفاوت را تولید کرده و در اختیار client قرار بدهند.به منظور ایجاد یک کارخانه برای تولید انواع قالب‌های مختلف برای عناصر مختلف یک صفحه وب استفاده می‌شود. زیرا یک وبسایت قادر است از موتور‌های رندر مختلف به صورت همزمان پشتیبانی کند. به دلیل تفاوت در کدهای مربوط به هر یک از موتور‌های رندر قالب، ایجاد Template‌ها باید توسط کارخانه اختصاصی خود انجام شوند.ادامهبیشترهدف الگوی Builderجدا کردن دستورالعمل تولید یک محصول از کسی که محصول را تولید میکند و نظارت بر نحوه ی تولید، توسط یک مدیر به منظور این که بتوان همان محصول را به شکلی متفاوت با قابلیتی متفاوت تولید کرد.سناریوی زیر را در نظر بگیرید:از شما خواسته شده است تا نحوه‌ی ساخت تلفن همراه را پیاده سازی نمایید. شما در گام اول 2 نوع تلفن همراه را شناسایی نموده‌اید (Android و Windows Phone). پس از شناسایی، احتمالا هر کدام از این انواع را یک کلاس در نظر می‌گیرید و به کمک یک واسط یا کلاس انتزاعی، شروع به ساخت کلاس می‌نمایید، تا در آینده اگر تلفن همراه جدیدی شناسایی شد، راحت‌تر بتوان آن را در پیاده سازی دخیل نمود.اگر چنین فکر کرده اید باید گفت که 90% با الگوی طراحی Builder آشنا هستید و از آن نیز استفاده می‌کنید؛ بدون اینکه متوجه باشید از این الگو استفاده کرده‌اید. ادامهبه کارگیری الگوی طراحی سازنده در طراحی نرم افزارها، با افزایش انعطاف پذیری و خوانایی کدها همراه خواهد بود. البته از طرفی دیگر پیاده سازی این الگو نیازمند ساخت چندین کلاس و تابع اضافه است. الگوی طراحی سازنده در موارد زیر کاربردی خواهد بود :1- امکان ساخت نمونه‌های مختلفی از یک شی را فراهم می‌سازد (برای مثال خانه‌های چوبی، سنگی و...).2- باعث جلوگیری از ساخت تعداد زیادی Constructor برای ساخت اشیا می‌شود.3- ساخت اشیای پیچیده و مرکب را ساده‌تر می‌کند. ادامهبیشترالگوهای رفتاری behavioralالگوهای structural و creational بر روی ایجاد اشیا متمرکز بودند. اما در الگوهای رفتاری به الگوریتم ها، مبادله ی اطلاعات و رفتار کلاس ها توجه میشود.این الگوها نحوه بیان تقسیم عملیات بین کلاس ها را تعریف کرده و چگونگی ارتباط بین آنها را بهبود میدهند.StrategyStateTemplate MethodChain of ResponsibilityCommandIteratorMediatorObserverVisitorInterpreterMementoهدف الگوی Strategyتعریف interface بیرونی یک الگوریتم به شکل انتزاعی به منظور فراهم کردن پیاده سازی آن به شکل های مختلف.اگر بخواهیم یک مثال ساده از الگوی Strategy بزنیم می توانیم برنامه ای را مثال بزنیم که با استفاده از روش های متفاوت مرتب سازی یک سری اعداد را مرتب سازی می کند. الگوریتم های متفاوتی برای مرتب سازی وجود دارد که می توان به QuickSort و یا MergeSort اشاره کرد. هرکدام از این روش ها می توانند در شرایط خاصی بهترین انتخاب موجود باشند. می توان تصمیم گیری این شرایط را با استفاده از الگوی Strategy پیاده سازی نمود. به این شکل که یک مجموعه از ورودی ها را داریم. ولی هرکدام از روش های مرتب سازی را به صورت جداگانه پیاده سازی می کنیم. ولی ورودی ها و خروجی ها ی یکسانی داشته باشند. در این صورت با توجه به شرایط ورودی ها را به یک الگوریتم داده و خروجی آن را دریافت خواهیم کرد. ادامهبرای مثال فرض کنید که ما در حال طراحی یک برنامه مسیریابی برای یک شبکه هستیم. همانطوریکه می‌دانیم برای مسیر یابی الگوریتم‌های مختلفی وجود دارد که هر کدام دارای مزایا و معایبی هستند. و با توجه به وضعیت موجود شبکه یا عملی که قرار است انجام پذیرد باید الگوریتمی را که دارای بالاترین کارائی است انتخاب کنیم. همچنین این برنامه باید امکانی را به کاربر بدهد که کارائی الگوریتم‌های مختلف را در یک شبکه فرضی بررسی کنید. حالا طراحی پیشنهادی شما برای این مسئله چست؟دوباره فرض کنید که در مثال بالا در بعضی از الگوریتم‌ها نیاز داریم که گره‌های شبکه را بر اساس فاصله‌ی آنها از گره مبداء مرتب کنیم. دوباره برای مرتب سازی الگوریتم‌های مختلف وجود دارد و هر کدام در شرایط خاص، کارائی بهتری نسبت به الگوریتم‌های دیگر دارد. مسئله دقیقا شبیه مسئله بالا است و این مسله می‌توانند دارای طراحی شبیه مسله بالا باشد. پس اگر ما بتوانیم یک طراحی خوب برای این مسئله ارائه دهیم می‌توانیم این طراحی را برای مسائل مشابه به کار ببریم.هر کدام از ما می‌توانیم نسبت به درک خود از مسئله و سلیقه کاری، طراح‌های مختلفی برای این مسئله ارائه دهیم. اما یک طراحی که می‌تواند یک جواب خوب و عالی باشد، الگوی استراتژی است که توانسته است بارها و بارها به این مسئله پاسخ بدهد.الگوی استراتژی گزینه مناسبی برای مسائلی است که می‌توانند از چندین الگوریتم مختلف به مقصود خود برسند.ادامهبیشترهدف الگوی Stateفراهم کردن قابلیت تغییر رفتار برای یک شی در حالت های مختلف وضعیت آن.یک برنامه پرواز را در نظر بگیرید که توسط یک شرکت هواپیمایی استفاده می شود. کار این برنام به این شکل است که هر مسافر که برای اولین بار برای پرواز به این شرکت می آید در وضعیت آبی قرار دارد. سیستم برای مسافران وضعیت آبی امکانات و تسهیلات خاصی در نظر می گیرد. و قیمت پرواز را برای آنان به گونه ای حساب می کند که تخفیف ندارد و همچنین مسافت پروازی آنان نیز محدود است. بعد از 5 پرواز که همان مسافر با این شرکت هواپیمایی انجام داد و پروازش در این سیستم ثبت شد مسافر از وضعیت آبی به وضعیت نقره ای ارتقاع پیدا می کند. سیستم برای مسافران وضعیت نقره ای برای هر پرواز 5 درصد تخفیف در نظر می گیرد و همچنین مسافت پرواز را به اندازه ای افزایش می دهد. حال اگر شخصی بیش از 15 پرواز انجام داده باشد به وضعیت طلایی خواهد رسید و برای هر پرواز 15 درصد تخیفیف خواهد گرفت. دقت کنید که مسافر باید این پرواز ها را در طول یک سال انجام دهد. حال وضعیت مسافر را توسط الگوی State پیاده سازی می کنیم. در الگوی State رفتار کلاس با توجه به حالت (State) کلاس تغییر می کند. این الگو یک الگوی رفتاری است. در این الگو ما اشیائی را می سازیم که حالت های مختلف یک کلاس را دارا می باشد.این الگو برای پیاده سازی ابزارهای گرافیکی مورد استفاده قرار بگیرد و در کل برای اشیائی که باید در زمان اجرا تغییر کند. همچنین برای اشیایی که در حال پیچیده شدن هستند و شرط های زیادی دارند قابل استفاده است. ادامهبیشترهدف الگوی Template Methodاسکلت کلی یک الگوریتم را تعریف کرده و این امکان را فراهم میکند که بدون تغییر ساختار کلی الگوریتم بتوان برخی از مراحل آن را به زیر کلاس ها سپرد.سناریویی وجود دارد که در آن شما می‌خواهید تنها یک کار را انجام دهید، ولی برای انجام آن n روش وجود دارد. برای مثال قصد مرتب سازی دارید و برای اینکار روش‌های مختلفی وجود دارند. برای حل این مساله پیشتر از الگوی طراحی استراتژی استفاده نمودیم.حال به سناریویی برخورد کردیم که بصورت زیر است:می‌خواهیم یک کار را انجام دهیم ولی برای انجام این کار تنها برخی بخش‌های کار با هم متفاوت هستند. برای مثال قصد تولید گزارش و چاپ آن را داریم. در این سناریو خواندن اطلاعات و پردازش آن‌ها رخدادهایی ثابت هستند. ولی اگر بخواهیم گزارش را چاپ کنیم به مشکل می‌خوریم؛ چرا که چاپ گزارش به فرمت اکسل، فرمت و روش خود را دارد و چاپ به فرمت PDF شرایط خود را دارد.در این سناریو دیگر الگوی طراحی استراتژی جواب نخواهد داد و نیاز داریم با یک الگوی طراحی جدید آشنا بشویم. این الگوی طراحی Template Method نام دارد. ادامهبیشترهدف الگوی Chain of Responsibilityشکستن اتصال مستقیم درخواست دهنده به کسی که درخواست را سرویس میدهد با ایجاد زنجیره ای از اشیا سرویس دهنده که یکی پس از دیگری بر حسب اولویت برای پاسخگویی به درخواست ، تلاش کرده و اگر قادر به سرویس دهی درخواست نباشید این مسئولیت را به شی بعدی زنجیره ارجاع می دهند.سناریوی گرفتن وام دانشجویی را در نظر بگیرید؛ به این صورت که دانشجو وارد سامانه شده، رمز خود یا شماره دانشجویی خود را زده و درخواست خود را ثبت می‌کند و پاسخی را از سیستم دریافت میکند. فرض کنید سلسله مراتب سیستم به این صورت باشد که ابتدا بررسی میکند که دانشجو فعال باشد. مرحله بعد رمز دانشجو صحیح باشد. مرحله بعد اینکه مقدار وامی که قبلا گرفته است، از حداکثر وام ثبت شده در سیستم بیشتر نباشد و مرحله آخر هم ثبت درخواست وام.اولین راه حلی که به ذهن میرسدif elseswitch caseبله مورد اولی که به ذهن خود من رسید، استفاده از if else هست. شاید خروجی مناسبی را از نظر کدنویسی داشته باشد؛ ولی خوانایی مناسبی را ندارد. حالا چطور اثبات کنیم خوانایی و قابلیت توسعه‌ی پایینی را دارد؟فرض کنید شما برنامه را نوشته‌اید و تحویل مدیر خود داده‌اید. بعد از دو ماه به شما گفته می‌شود که مراحل 1 و 2 را جابجا کنید و یا یک step را اضافه کنید که بعد از مرحله دو (بررسی رمز) است تا یک منطق جدید را دنبال کند. اینجاست که دچار دردسر و اتلاف زمان میشویم؛ چون باید بیزینس را مجددا review کنیم و بدتر از آن کدها را هم تغییر دهیم که امکان رخ دادن خطا به شدت بالا می‌رود. ادامهبیشترهدف الگوی Commandفاصله انداختن بین درخواست دهنده و گیرنده ی درخواست با ذخیره کردن درخواست ها به شکل شی و فراهم کردن قابلیت هایی مانند Undo،Rendo ،لاگ گیری از فعالیت کاربر، اسکریپت نویسی و مانند آن.لگوی Command در سیستم منو های بسیاری از برنامه های معروف استفاده می شود. در بسیاری از نرم افزار هایی که امروزه با آنها سرو کار داریم منویی به نام Edit دارند که اعمال کپی و کات کردن را داخل منوی Edit دارند و از طرفی هم همان اعمال کپی و کات کردن در داخل نوار ابزار بالای صفحه نیز موجود می باشد. این به این معنی است که هر دوی آنها یک عمل را انجام می دهند. و این اعمال دارای قابلیت Undo نیز می باشند. همه ی این اعمال کاربرد های الگوی Command می باشد. ادامهبیشترهدف الگوی Iteratorفراهم کردن راهی که طی آن بتوان عناصر یک شی انجمنی(aggregate object) مانند یک لیست یا مجموعه ای از داده ها را بدون آگاهی از ساختار آن یا بر ملا کردن محتویات آن یکی پش از دیگری پردازش کرد.فرض کنید قبلا کلاسی بنام CollectionClass را داشته‌اید که در آن یک آرایه از نوع []String تعریف کرده‌اید. همچنین n تا کلاس هم دارید که از آرایه‌ی تعریف شده‌ی در CollectionClass استفاده می‌کنند. تا اینجا مشکلی نیست. مشکل زمانی شروع می‌شود که متوجه می‌شوید دیگر این آرایه کارآیی ندارد و باید آن را با &lt;List&lt;string جایگزین کنید. واضح است که نمی‌توانید همه کلاس‌هایی را که از CollectionClass استفاده کرده‌اند، بیابید و آنها را تغییر دهید؛ چرا که شاید برخی از کلاس‌ها اصلا در دسترس شما نباشند یا هر دلیل دیگری.راهگشای این مشکل، استفاده از الگوی طراحی Iterator است. در این الگو، باید کلاس CollectionClass ابتدا واسط IEnumerable را پیاده سازی نماید. این واسط متدی بنام GetEnumerator دارد که می‌توان به کمک آن، درون آرایه یا هر نوع کالکشن دیگری حرکت کرده و آیتم‌های آن را برگرداند.ادامهاز این الگو در موارد زیر استفاده می شود:برای دسترسی به محتوای یک شئ تجمعی بدون در نظر گرفتن ساختار داخلی آن.برای پیمایش در اشیا تجمعی(هر گاه هر شی خود دارای زیر گروه هایی از اشیا باشد و بخواهیم به همه آن ها دسترسی داشته باشیم.)برای فراهم کردن یک واسط یکتا برای پیمایش ساختار های تنوعی متفاوت. ادامهبیشترهدف الگوی Mediatorتعریف شی واسطه برای جلوگیری از ارتباط مستقیم اشیا مختلف به یکدیگر و مدیریت روابط بین آنها.برج مراقبت یک فرودگاه را در نظر بگیرید. این بخش از تمامی هواپیماهایی که تردد میکنند باخبر بوده و وظیفه مدیریت پرواز آن ها را بر عهده داشته و اجازه فرود و پرواز آن ها را صادر میکند. در صورتی که اجازه فرود داده نشود ، هواپیما اجازه به نشستن ندارد. ادامهبیشترهدف الگوی Observerبین یک شی و تعدادی شی دیگر رابطه یک-به-چند تعریف میکند به گونه ای که وقتی شی نخست تغییر میکند وقوع تغییر را به اشیا مرتبط با خود اعلام میکند تا آنها به دنبال آن کاری را به تناسب انجام بدهند.یک لامپ و سوئیچ برق را درنظر بگیرید. زمانیکه لامپ مشاهده می‌کند سوئیچ برق در حالت روشن قرار گرفته‌است، روشن خواهد شد و برعکس. در اینجا به سوئیچ، subject و به لامپ، observer گفته می‌شود. هر زمان که حالت سوئیچ تغییر می‌کند، از طریق یک callback، وضعیت خود را به observer اعلام خواهد کرد. علت استفاده از callbackها، ارائه راه‌حل‌های عمومی است تا بتواند با انواع و اقسام اشیاء کار کند. به این ترتیب هر بار که شیء observer از نوع متفاوتی تعریف می‌شود (مثلا بجای لامپ یک خودرو قرار گیرد)، نیازی نخواهد بود تا subject را تغییر داد.عموما به شیءایی که قرار است وضعیت را مشاهده یا رصد کند، Observer گفته می‌شود و به شیءایی که قرار است وضعیت آن رصد شود Observable یا Subject گفته می‌شود. ادامهفرض کنید شما علاقه مند به اخبار ورزشی هستید. برای دنبال کردن اخبار ورزشی، یک مجله معتبر و خوب پیدا می‌کنید. در اشتراک ماهانه/هفتگی آن مجله عضو می‌شوید. با اینکار، هر بار که مجله فوق شماره جدیدی چاپ کند، موظف است این نسخه جدید را برای شما ارسال کند. در نتیجه این نسخه جدید برای شما ارسال می‌شود و شما قادر خواهید بود تا اخبار ورزشی جدید را در این شماره پیدا کنید. اما این چرخه تا کی ادامه خواهد داشت؟ مسلما تا زمانی که شما اشتراک ماهانه/هفتگی را تمدید کنید. پس اگر اشتراک خود را تمدید نکنید و یا بصورت داوطلب انصراف دهید، دیگر نسخه‌های جدید مجله برای شما ارسال نخواهد شد.الگوی طراحی Observer در واقع پیاده سازی ایده‌ی فوق است. در این الگو کلاس مورد نظر ما یک لیست از اعضا دارد. بخش‌های دیگر برنامه می‌توانند در این لیست عضو شوند. در صورتی که تغییری در کلاس ما اتفاق بیوفتد، این تغییر به همه اعضای لیست اعلام خواهد شد. اعضا در واقع هر بخشی از برنامه است که می‌خواهد تغییری را در کلاس ما نظارت کند. به عنوان یک مثال کاربردی فرض کنید دو موجودیت مشتری و فروشگاه داریم. یکی از مشتری‌ها به یک برند خاص(مثلا اپل) خیلی علاقه دارد و هر روز برای اینکه بداند مدل جدید گوشی این برند در فروشگاه موجود است یا خیر، به فروشگاه سر می‌زند. ادامهبیشترهدف الگوی Visitorساده سازی اجرای یک عملیات بر روی مجموعه ای از اشیا ناهمگون که مفهوم و ماهیت آن عملیات به طور کلی ثابت است اما هر شی ، آن را به شکل متفاوتی انجام می دهد.این الگو یکی دیگر از الگوهای رفتاری است که به قاعده OCP یا Open Closed Principle کمک بسیاری می‌کند. این الگو برای زمانی مناسب است که ما سعی بر این داریم تا یک سری الگوریتم‌های متفاوت را بر روی یک سری از اشیاء پیاده سازی کنیم. به عنوان مثال تصور کنید که ما در یک سازمان افراد مختلفی را از مدیریت اصلی گرفته، تا ساده‌ترین کارمندان، داریم و برای محاسبه حقوق و مالیات و ... نیاز است تا برای هر کدام دستور العمل‌هایی را اجرا کنیم  و ممکن است در آینده تعداد این دستور العمل‌ها بالاتر هم برود. ادامهبیشترهدف الگوی Interpreterتعریف قوانین یک زبان به صورت شی گرا برای بیان جملات زبان و فراهم کردن مفسری که بتواند جملات زبان را تفسیر کند.بیشتر !هدف الگوی Mementoذخیره سازی وضعیت شی در یک منبع خارجی به منظور احیا وضعیت آن در آینده بدون آن که اطلاعات خصوصی شی بر ملا شده یا از خصلت کپسوله سازی و پنهان سازی اطلاعات تخطی شود.همه ی نرم افزارهای مدرن امروزه از قابلیتی به نام Undo استفاده می نمایند. این قابلیت به این صورت است که اگر ما کاری را در یک نرم افزار انجام داده باشیم و بخواهیم که برنامه این عمل ما را نادیده فرض کنید از این قابلیت استفاده می نماییم. و برنامه را به حالت قبل از عمل برمی گرداند. به طور مثال اگر در یک برنامه واژه پرداز (word processor) متنی را نوشته باشیم یا متنی را به عمد و یا غیر عمد حذف کرده باشیم ولی از انجام آن پشیمان شویم از قابلیت undo استفاده می نماییم. همچنین در بازی های رایانه ای موجود وقتی به مرحله ی خاصی از بازی رسیدیم وضعیت بازی ذخیره می شود. که به هر قسمت ذخیره شده یک check point گفته می شود. ذخیره سازی وضعیت نرم افزار در برنامه گفته شده و check point بازی با استفاده از الگوی memento انجام می شود.اهداف این الگو1- بدون این که خللی در کپسوله سازی وارد کند حالت فعلی یک شی را دریافت و نگهداری می کند.2-حالت شی را بعد از این که ذخیره کرد هر وقت که نیاز داشته باشیم برمی گرداند. این ویژگی برای گرفتن Checkpoint و مکانیزم undo مفید است.ادامهبیشتربطور خلاصهالگوی Abstract Factory: خانواده هایی از اشیا که اعضای خانواده به یکدیگر مرتبط هستند را تولید می کند.الگوی Adapter: اینترفیسی ایجاد می کند که کلاس هایی که با هم مرتبط نیستند بتوانند با یکدیگر کار کنند.الگوی Bridge: جدا ساختن قسمت پیاده سازی از قسمت انتزاعی یک کلاس برای این که دو طرف بتوانند به راحتی و مستقلا تغییر کنند.الگوی Builder: ساخت يک شی پيجيده را به گونه اي از نمايش آن مجزا مي کند که همان فرآيند ساخت مي تواند نمایش های متفاوتی ایجاد کند.الگوی Chain of Responsibility: در قالب یک زنجیره از اشیا به درخواست کاربر پاسخ می دهد.الگوی Command: مشخص می کند که یک عملیات(operation) چگونه انجام شود و انجام آن ها را مدیریت می کند.الگوی Composite: اشیا را در ساختارهاي درختي ترکيب مي کند. Composite به کاربران اجازه مي دهد با اشیا منفرد و اشیا ترکيبي به طور يکسان برخورد کنند.الگوی Decorator: مسؤوليت هاي اضافي را به طور ديناميک به يک شی ضميمه مي کند . Decorator ها جايگزيني انعطاف پذير جهت طبقه بندي فرعي براي توسعه عملکرد مهيا مي کنند .الگوی Facade: اینترفیسي يکنواخت براي مجموعه ميانجي هاي موجود در يک کلاس فرعي مهيا مي کند . نماي خارجي، اینترفیس سطح بالاتري را تعريف مي کند که استفاده از سيستم فرعي را ساده تر مي کند .الگوی Factory Method: يک اینترفیس جهت ايجاد يک شی تعيين مي کند ، ولي اجازه مي دهد کلاس هاي فرعي تصميم بگيرند کدام کلاس را معرفي کندالگوی Flyweight: زمانی استفاده می شود که تعداد اشیا بسیار زیاد باشد و مدیریت آنها سخت باشد.الگوی Interpreter: جهت تعریف گرامرهای یک زبان و تفسیر جملات استفاده می شود که تنها در طراحی کامپایلرها کاربرد دارد.الگوی Iterator: شيوه اي جهت دسترسي به عناصر يک شی بهم پيوسته به طور متوالي تدارک مي بيند بدون اين که نمايش موجود را دچار مخاطره کند .الگوی Mediator: شیئی را تعيين مي کند که چگونگي تعامل يک مجموعه اشیا را در یک محفظه قرار مي دهد. همچنین باعث می شود که اشیا به طور دو به دو کمتر با هم ارتباط داشته باشند و پدیده ی coupling کمتر شود.الگوی Memento: حالت دروني يک شی را به گونه اي دقيق ذخیره می کند که بعدا بتوان شی را به اين حالت بازگرداند.الگوی Observer: يک وابستگي يک به چند ميان اشیا را به گونه اي تعريف مي کند که هنگامي که يک شی تغيير کند کليه موارد وابسته به آن متوجه شده و به طور خودکار بهنگام سازي شوند .الگوی Prototype: برای ساخت و کپی کردن شیئی جدید که خواص شی اصلی را داشته باشد.الگوی Proxy: براي شی ديگر يک جانشين يا جاي گيرنده فراهم مي کند تا چگونگي دسترسي به آن را کنترل کند .الگوی Singleton: تضمين مي کند که يک کلاس فقط يک نمونه داشته باشد ، و يک نمونه ي کلي جهت دسترسي به آن را مهيا کند .الگوی State: به يک شی اجازه مي دهد هنگامي که حالت دروني آن تغيير کرد رفتار خود را عوض کند . به نظر مي رسد که شی کلاس خود را عوض مي کند .الگوی Strategy: يک خانواده از الگوريتم ها را تعريف کرده ، هر يک را در پوشش قرار داده و آن ها را قابل تعویض مي سازد . استراتژي اجازه مي دهد الگوريتم به طور مستقل از کاربران که از آن استفاد مي کنند متفاوت باشد .الگوی Template Method: اسکلت بندي الگوريتم در يک عمليات را تعريف کرده ، پیاده سازی بعضي مراحل را یه کلاس های فرعی می سپارد. همچنین به کلاس هاي فرعي مجال مي دهد بعضي مراحل يک الگوريتم را بدون تغيير ساختار الگوريتم دوباره تعريف کند .الگوی Visitor: ويزيتور به شما مجال مي دهد عمليات جديد را بدون تغيير کلاس هاي عناصري که در آن کار مي کند تغيير دهيد .منبع این بخش  https://virgool.io/@espiar/%D9%85%D9%82%D8%AF%D9%85%D9%87-design-patterns-y8ypfllrygl5 کلام آخر اینکه باز این الگو ها رو می توان با هم ترکیب کرد برای اطلاعات بیشتر کتاب الگو های طراحی در C# 5 بخوانید (نسخه سی شارپش خیلی قدیمی هست با سی شارپ جدید می تواند الگوها را طوری دیگر پیاده کرد)منبع عکس ،در عکس آورده شده است</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Sun, 26 Apr 2020 18:45:08 +0430</pubDate>
            </item>
                    <item>
                <title>تنظیم visual studio برای استفاده F#</title>
                <link>https://virgool.io/@espiar/%D8%AA%D9%86%D8%B8%DB%8C%D9%85-visual-studio-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-f-yfui0bss0ypk</link>
                <description>خوب دوستان برای استفاده از syntax پیشفرض F# که همون lightweight syntax هست باید مانند پایتون از تو رفتگی استفاده کنید.حالا مشکل جاییست که برای خوانایی بیشتر از TAB بجای SPACE استفاده میکنید! مشکلی که هست اینکه باید حتما از SPACE بجای TAB استفاده شود!.اگر از TAB استفاده کنید خطای زیر میدهد:tabs are not allowed in f# code unless the #indent off option is usedبرای حل این مشکل در تنظیمات زبان F#  باید TAB به SPACE تبدیل کنیم:با این کار فقط در زبان F# تب ها به space  ها تبدیل میشوند و خطای بالا برطرف و کد خوانایی بیشتر خواهد داشت.</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Wed, 08 Apr 2020 17:27:12 +0430</pubDate>
            </item>
                    <item>
                <title>چگونه یاد بگیریم ؟ و از چه ابزارهایی استفاده کنیم</title>
                <link>https://virgool.io/@espiar/%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%88-%D8%A7%D8%B2-%DA%86%D9%87-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-sr862x2fvo1u</link>
                <description>چیز که می خواهم بگم در مورد روش یادگیری خودم هست و در مورد مسائل کامپیوتری هست ولی فکر میکنم این روش یادگیری در موارد دیگر هم جواب بدهد.مرحله اول فیلمابتدا باید آموزش پایه ای سریع یاد بگیرم این کار را توسط فیلم های آموزش فارسی انجام میدهم.(فیلم آموزشی سریع مفاهیم پایه مثل اینکه آن آموزش درباره چیه چطوری راه اندازی کنیم ، مثال های ساده و ...) ولی فیلم هیچ وقت موضوع را نمی شکافد (حداق فیلم های آموزشی که من دیدم اینطوری بود)مرحله دوم  کتابخواندن یک مرجع کامل که شامل کتاب هست. معمولا حجم کتاب زیاد و زمان یادگیری زیاد (بخصوص اگر مبحث سنگین باشد). وقتی که فیلم را دیدم و با آن مبحث آشنایی پیدا کردم(مرحله اول را گذراندم) در خواندن کتاب خیلی کمک می کند و باعث یادگیری سریع تر میشود.کتاب مرجع ، آن مبحث آموزشی برای من می شکافد.مرحله سوم مستندات خواندن مستندات آن آموزش -معمولا هر آموزش (هرچی می خواهید باشد) یک سایت منبع و مستندات دارد- از آنجایی که کتاب ها و منابع فارسی  بروز نیستند! خواندن مستندات من را با مفاهیم جدید آشنا می کند. در صورتی که آن مبحث بروز شود مباحث جدید در مستندات گنجانده میشود. مستندات زبان اصلی هستند، پایین تر ابزارهای کمکی معرفی میکنم که با آنها می توانید زبان انگلیسی راحت تر فهمید.مرحله چهارم کارکردن با طی کردن مراحل قبل من به صورت تئوری با آن مبحث آموزشی کاملا آشنا شدم. حالا نوبت به کارگیری آموخته های خودم به صورت عملی هستم. شروع یک پروژه تمرینی در آن مبحث. این کار باعث میشه با مسائل در دنیای واقعی آشنا شوم. مرحله پنجم برخورد با مشکل در کارکردندر صورت برخورد به مشکل ابتدا به کتاب مرجع و مستندات رجوع می کنم اگر مشکل  رفع نشد آن را با افراد آگاه در آن زمینه مطرح میکنم (به صورت مستقیم یا در تلگرام یا در سایت stackoverflow-این مورد بیشترین جواب گرفتم- یا از هر طریق دیگری) پس از گرفتن جواب درست از افراد دنبال آن جواب در کتاب مرجع و مستندات میگردم تا آن را پیدا کنم.معرفی ابزار کمکی زبان انگلیسیابتدا به معرفی افزونه مترجم گوگل برای مرورگر chrome می پردازیم. می توانید آن را از این لینک برای مرورگر کروم دانلود کنید.امکانات خوبی ارائه می دهد:با select کردن text یک پاپ آپ باز می شود که اطلاعاتی در آن می باشد (تصویر بالا) با کلیک روی icon بلندگو تلفظ انگلیسی آن آشنا خواهید شد (انگلیسی نه آمریکایی!)تنظیمات آن را طبق زیر انجام دهید:ابتدا روی پاپ آپ باز شده بر روی گزینه EXTENSION OPTIONS کلیک کنید(تصویر بالا) و تنظیمات رو مانند تصویر زیر انجام دهید:زبان اصلی فارسی قرار دهید تا ترجمه ها به زبان فارسی انجام شوند.و گزینه وسط را انتخاب کنید که با انتخاب متن پاپ آپ نمایش داده شود. و سیو را بزنید.درسته که ترجمه درستی ارائه نمی کند (بخصوص در جمله بندی !) ولی مفهوم کلمه را میرساند (مانند تصویر اول) با استفاده از این افزونه به مرور زمان یادگیری لغات بالا میرود (بعد 100 بار خواندن گوش دادن به تلفظ و دیدن معنی کلمه در 101 بار این کلمه را یاد خواهید گرفت)افزونه بعدی که می خواهم معرفی کنم برای نوشتن بسیار کاربری هست و آن چیزی نیست جز grammarly این افزونه برای نوشتن متن به زبان انگلیسی (آمریکایی یا انگلیسی) می باشد. به این صورت کار می کند که متن انگلیسی شما را از لحاظ گرامری ، پیشنهاد کلمه بهتر ، رساندن مفهوم ، غلط املایی  و... چک میکند. متاسفانه این افزونه پولی می باشد و قیمت خیلی بالایی هم دارد اما نسخه رایگانش رو نصب کنید بد نیست.در آخر معرفی ترفندی برای KMPlayer و PotPlayer که سازنده هردو یکی هست معرفی کنم. توسط این کار شما با مشاهده فیلم دارای زیرنویس انگلیسی ،با کلیک بر روی هر کلمه ای را که متوجه نشدید یک پنجره مرورگر را باز کرده و آن کلمه را به مترجم گوگل ارسال میکند! برای این کار :ابتدا یک فیلم با زیرنویس انگلیسی را اجرا کنید بعد از آن روی یک کلمه از زیرنویس راست کلیک . سفارشی را انتخاب کنید:روی افزودن کلیک کنید و مقدار زیر را درون آن قرار دهید:https://translate.google.com/#view=home&amp;op=translate&amp;sl=en&amp;tl=fa&amp;text=%%SSو در آخر هم با استفاده از دکمه بالا آن را به بالاترین سطح بیاورید:حالا با کلیک روی هر کلمه پنجره جدید در مرورگر باز میشود و کلمه کلیک شده را به آدرس ما (در اینجا مترجم گوگل) می فرستد !این روش یادگیری من هست و نمیدونم درست هست یا نه ولی برای من خوب جواب داده. تمام!اگر کسی ابزار دیگری می شناسد بگویید تا هم من استفاده کنم هم در این مطلب بنویسم.</description>
                <category>آرمان</category>
                <author>آرمان</author>
                <pubDate>Mon, 24 Feb 2020 14:53:59 +0330</pubDate>
            </item>
            </channel>
</rss>