<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مسعود بختیاری</title>
        <link>https://virgool.io/feed/@masoudbkhti</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 20:05:31</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2537902/avatar/avatar.png?height=120&amp;width=120</url>
            <title>مسعود بختیاری</title>
            <link>https://virgool.io/@masoudbkhti</link>
        </image>

                    <item>
                <title>تبدیل ي و ك عربی به فارسی در NET.</title>
                <link>https://virgool.io/@masoudbkhti/%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D9%8A-%D9%88-%D9%83-%D8%B9%D8%B1%D8%A8%DB%8C-%D8%A8%D9%87-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-net-kkblutckumk4</link>
                <description>عکس به کمک AI درست شده. به نظر جالبه نه؟یکی از دردسرها در هر پروژه ای تبدیل حروف ي و ك عربی به فارسیه. من برای حل این مشکل راه های مختلفی رو امتحان کردم. از Override كردن متدهای read و write مربوط به newtonsoft و اضافه کردن attribute به property های string بگیر تا استفاده از model binding و interceptor و .... .تمام این روش ها جواب می دهند و هر کدام به نحوی مشکل را حل می کنند اما مزایا و معایب خودشون رو دارند. یکی از مشکلاتی که من داشتم این بود که با وجود استفاده از Ef Core در پروژه، بعضی از کوئری های پیچیده به صورت sql نوشته و با ExecuteReaderSqlAsync اجرا شده بودند.بنابراین یکی از مشکلات در روش جایگزینی ي و ك عربی با فارسی در NET. با استفاده از Interceptor این است که ممکن است از Raw SQL یا Stored Procedure استفاده شده باشد. این کوئری ها مسلما از Command Interceptor عبور نمی کنند و قابل رهگیری و تغییر برای ما نیستند.از طرفی کوئری هایی که با EF Core نوشته شده اند هم در صورتی که از ()AsNoTracking استفاده شده باشه تغییرات روی موجودیت ها ردیابی نمی شوند و اگر ()EnableSensitiveDataLogging رو فعال بکنید کوئری های مربوط به Update در لاگ ها ظاهر نمیشه و خود این مشکل هم باعث میشه که یه سری از ورودی ها رو از دست بدیم و نتونیم ي و ك عربی رو به فارسی تبدیل کنیم.بهترین روش برای تبدیل ي و ك عربی به فارسی در NET.پس از کلی تست و درگیری و بررسی بالاخره به این نتیجه رسیدم که بهترین راه برای تبدیل ي و ك عربی به فارسی در NET. این هست که از یک Middleware استفاده کنم و Body تمام ریکوئست هایی که از نوع application/json هستند رو با استفاده از Buffering بررسی کنم و در صورت وجود ي و ك عربی اون ها رو به ی و ک فارسی تبدیل کنم. اینجوری تمام ورودی ها به صورت صحیح وارد برنامه و در نهایت در دیتابیس ذخیره می شوند و دیگه نیازی به اضافه کردن attribute به پراپرتی مدل ها نداریم و اگر از Raw SQL یا Stored Procedure هم استفاده شده باشه یا در ef از ()AsNoTracking استفاده شده باشه هیچ مشکلی به وجود نمیاد چون تمام درخواست ها قبل از اینکه به کنترلر برسند اصلاح شده اند.در ادامه کد مربوط به YekeMiddleware رو قرار میدم‍‍‍‍ public class YekeMiddleware {     private readonly RequestDelegate _next;     public YekeMiddleware(RequestDelegate next)     {         _next = next;     }     public async Task InvokeAsync(HttpContext context)     {         if (context.Request.ContentType != null &amp;&amp; context.Request.ContentType.Contains(&amp;quotapplication/json&amp;quot))         {             context.Request.EnableBuffering();               using (var reader = new StreamReader(context.Request.Body, Encoding.UTF8, leaveOpen: true))             {                 var body = await reader.ReadToEndAsync();                 body = body.Replace(&amp;quotي&amp;quot, &amp;quotی&amp;quot).Replace(&amp;quotك&amp;quot, &amp;quotک&amp;quot);                 context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(body));             }         }         await _next(context);     } }</description>
                <category>مسعود بختیاری</category>
                <author>مسعود بختیاری</author>
                <pubDate>Wed, 25 Dec 2024 12:18:19 +0330</pubDate>
            </item>
                    <item>
                <title>متغیرها در جاوا اسکریپت | تفاوت const و let و var</title>
                <link>https://virgool.io/masoud-bakhtiari/%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-const-%D9%88-let-%D9%88-var-s64upsgbslys</link>
                <description>ریلیز های مختلف جاوا اسکریپتنمودار  آپدیت های جاوا اسکریپت در طول زماندر این بلاگ قصد دارم چیزی که از متغیرها در جاوااسکریپت یادگرفتم رو به شما منتقل کنم. مطالبی که در ادامه می‌خونید حاصل تحقیق و مطالعه از منابع مختلف هست و عکس هایی که استفاده شده اند ممکنه از بلاگ ها یا ویدئوهای مختلف برداشته شده باشند. هر سال نسخه جدیدی از جاوااسکریپت ارائه می شود که در آن تغییراتی ایجاد می شود که کار را برای برنامه نویسان راحت تر می کند.مهمترین آپدیت اکمااسکریپت ES6 شامل تغییراتی از جمله اضافه شدن Spread، Destructuring، Template literal، let، const، Arrow functions، classes و ... می باشد.قبل از ES6 تنها راه تعریف متغیر در جاوا اسکریپت استفاده از var بود. برای اینکه بتونیم قابلیت ها و تفاوت های متغیر های جاوااسکریپت مدرن یعنی var و let و const  رو متوجه بشیم، اول باید با مقهوم اسکوپ (scope) در جاوا اسکریپت آشنا بشیم.اسکوپدر جاوااسکریپت هر متغیر یک name دارد که با آن شناخته می شود. در هر متغیر یک مقدار یا value وجود دارد. این متغیر می تواند در اسکوپ (محیط یا فضا) مختلفی قرار بگیرد. در تصویر زیر می تونید ببینید که محیط window در واقع بزرگترین global scope ما است که اگر یک متغیر در آن تعریف شود در تمام محیط های دیگه که زیر مجموعه window هستند، قابل دسترسی است.مفهوم اسکوپ در جاوااسکریپتدر تصویر زیر نیز می توانید با یک مثال تفاوت این سه Scope را ببینید.مثال اسکوپ در دنیای واقعی برای فهم بیشترهمون طور که در تصویر بالا می‌بینید، قوانین مربوط به حقوق بشر حکم گلوبال اسکوپ رو دارند و جامعیت اونا بیشتر از قوانین مربوط به یک کشور هست و همین طور قوانین یک کشور در اسکوپ بالاتری نسبت به قوانین یک ایالت از یک کشور قرار دارند.مفهوم Hoisting در Variable و functionهویستینگ به زبون ساده یعنی اینکه بتونیم از یک متغیر یا یک تابع قبل از اینکه تعریفش کرده باشیم، استفاده کنیم.همین اول باید بگم که مبحث hoisting اصلا در زبان های دیگه مثل پایتون، جاوا، C، C++ و ... وجود نداره و ممکنه باعث ایجاد خطا در کد ما بشه. بنابراین بهتره که کلا توابع و متغیر هامون رو اول تعریف کنیم و بعد ازشون استفاده کنیم.فقط قسمت declaration هوستینگ میشه (به بالا میره)هوستینگ داخل اسکوپ خود متغیر صورت میگیرهتفاوت var، let و constوقتی متغیر با let  و const داخل تابع یا بلاک تعریف بشه، فقط داخل همون تابع یا بلاک (اسکوپ خودش) قابل دسترسه و در اسکوپ بالاتر قابل دسترسی نیست.اما متغیری که با var تعریف بشه دو حالت داره:اگر داخل تابع تعریف شده باشد مثل let و const فقط داخل اسکوپ خودش قابل دسترس است.اما اگر داخل بلاک if یا for تعریف شده باشد ممکن است با یک متغیر دیگه که خارج از تابع یا بلاک است هم نام باشد. در این صورت (به دلیل قابلیت redeclare شدن var) مقدار آن متغیری که خارج از تابع یا بلاک است را به خود می گیرد. به همین دلیل داخل تابع یا بلاک برای تعیین متغیر از const و let استفاده می کنند.متغیر var در جاوا اسکریپتاینجا اسم هر دو متغیر name هست اما اونی که در فانکشن اسکوپ هست فقط در اسکوپ خودش در دسترسهدر اینجا var چون فقط داخل فانکشن اسکوپ تعریف شده دیگه بیرون اسکوپ خودش در دسترس نیستدر تصویر بالا می بینید که var وقتی داخل function scope تعریف می شود، فقط داخل همین فانکشن valid است و بیرون از اون valid نیست. (دقیقا مثل let) اما فرق let و var دقیقا همینجاست! در واقع var فقط زمانی که داخل function scope باشه این ویژگی رو داره و اگر در block scope تعریف بشه داستان جور دیگری خواهد بود که در ادامه توضیح می دهم.حالا حالت زیر رو ببینید:متغیر ها رو میشه بدون let ,const یا var هم تعریف کرد. در این صورت این متغیر اسکوپ گلوبال می گیره و اولویتش از همه بالاتر میشه. یعنی مثلا اگه یه متغیر به اسم name داخل تابع یا بلاک با var تعریف کنیم و یک متغیر به اسم name بدون var بیرون از تابع تعریف کنیم (یا بلعکس)، اولویت فراخوانی و اجرا با متغیری است که بدون var باشه. مثال زیر رو ببینید:پس متغیر var که گفتیم اگر داخل فانکشن اسکوپ تعریف بشه دیگه بیرون از اسکوپ خودش در دسترس نیست یک استثنا هم داره. اونم همین مثال بالاست. متغیر let در جاوا اسکریپتاگر متغیر را با let داخل یک بلاک تعریف کنیم و بعد بیرون از بلاک هم دقیقا با همان اسم و با let متغیر را تعریف کنیم، دیگه مثل var نیست که با هم قاطی بشن. در واقع let داخل بلاک فقط داخل همان بلاک قابل دسترسی است و به صورت زیر خواهد بود:حالا همین قطعه کد رو با var می نویسیم تا ببینیم چه اتفاقی می افتد:همان طور که دیدید، var که داخل block scope است با var که داخل global scope بود هر دو یک نام داشتند و به همین دلیل var داخل block scope با var قبل از خودش جایگزین شد. به این ویژگی var ها میگن redeclare شدن. در واقع var ها میتونن redeclare بشن و در این مثال هم به همین دلیل خروجی معادل value داده شده به var داخل block scope شده است.اما let قابلیت redeclare شدن نداره. در واقع ما نمیتونیم دو تا let هم نام در یک scope مشترک داشته باشیم و هر let فقط در scope خودش قابل دسترسی هست.حالا که در مورد redeclare  شدن صحبت کردیم باید به reassign کردن هم اشاره کنیم.در حقیقت reassign کردن یعنی اینکه متغیر رو بدون var، let یا const بنویسیم. این قابلیت برای var و let وجود داره اما برای const وجود نداره.یه نگاه به جدول زیر بندازید:لکسیکال اسکوپلکسیکال اسکوپ به این معنی است که هر تابع و بلاکی می تواند به متغیر های تعریف شده در خارج از اسکوپ خود (گلوبال اسکوپ) دسترسی داشته باشد.اما متغیر هایی که داخل خود فانکشن یا بلاک اسکوپ تعریف می شوند فقط داخل همان اسکوپ قابل دسترسی هستند و در گلوبال اسکوپ در دسترس نیستند.</description>
                <category>مسعود بختیاری</category>
                <author>مسعود بختیاری</author>
                <pubDate>Sat, 20 May 2023 23:29:42 +0330</pubDate>
            </item>
            </channel>
</rss>