<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های افشین</title>
        <link>https://virgool.io/feed/@afshin.talebi</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-08 02:00:09</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/29678/avatar/avatar.png?height=120&amp;width=120</url>
            <title>افشین</title>
            <link>https://virgool.io/@afshin.talebi</link>
        </image>

                    <item>
                <title>حلقه رویدادها (Event Loop) در JavaScript</title>
                <link>https://virgool.io/@afshin.talebi/%D8%AD%D9%84%D9%82%D9%87-%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%AF%D9%87%D8%A7-event-loop-%D8%AF%D8%B1-javascript-cxhk8sri9q2j</link>
                <description>تا به حال به این فکر کرده اید که چگونه برنامه های وب به طور پیوسته به ورودی های کاربر پاسخ می دهند و وظایف مختلف را به طور همزمان انجام می دهند؟ راز این عملکرد در حلقه رویداد (Event Loop) جاوا اسکریپت نهفته است.به زبان ساده، حلقه رویداد یک چرخه بی پایان است که مفسر JavaScript به طور مداوم آن را اجرا می کند. این چرخه وظایف مختلف را در پاسخ به رویدادهایی مانند کلیک کاربر، حرکت موس، بارگیری اسکریپت و غیره مدیریت می کند.چگونه عمل می کند؟حلقه رویدادها(Event Loop) به صورت single thread عمل می‌کند، به این معنی که تنها می‌تواند یک وظیفه را در هر زمان اجرا کند. این حلقه عملیات های غیرهمزمان را به وسیله توابع callback، promise ها و توابع async مدیریت می‌کند.زمانی که یک عمل غیرهمزمان(async) مانند دریافت داده از API یا انتظار انقضای یک تایمر اجرا می‌شود بلافاصله به API‌های مرورگر منتقل می‌شود و thread اصلی آزاد می‌شود تا ادامه اجرای کد را انجام دهد. وقتی کار غیرهمزمان به پایان می‌رسد، تابع callback مربوط به آن در صف رویداد قرار می‌گیرد.حلقه رویدادها به طور مداوم صف رویداد را برای عملیات های معلق بررسی می‌کند در حالی که thread اصلی خالی است. وقتی thread اصلی اجرای کد را به پایان می‌رساند، عملیات بعدی از صف رویداد را انتخاب می‌کند و تابع callback مربوط به آن را اجرا می‌کند.به طور خلاصه مراحل عملکرد حلقه رویدادها را می توان به صورت زیر شرح داد:انتظار برای رویداد: در این مرحله، مفسر Javascript منتظر می ماند تا یک رویداد رخ دهد.بررسی صف وظایف: پس از رخ دادن یک رویداد، مفسر Javascript صف وظایف را بررسی می کند.اجرای وظایف: وظایف مربوط به رویداد رخ داده از صف وظایف خارج شده و اجرا می شوند.تکرار: پس از اتمام وظایف، چرخه رویداد به مرحله اول باز می گردد و منتظر رویداد بعدی می ماند.چرا وجود حلقه رویدادها مهم است؟حلقه رویدادها در Javascript به دلیل عملکرد ناهمزمانی که فراهم می‌کند، بسیار حیاتی است. این حلقه به توسعه‌دهندگان امکان می‌دهد تا کدهایی را بنویسند که واکنشگرا و کارآمد باشند و به آنها این قابلیت را می‌دهد که عملیات‌های ناهمزمان را مدیریت و هماهنگ کنند. با استفاده از حلقه رویدادها، می‌توان از قفل‌کردن thread اصلی جلوگیری کرده و کارایی و پاسخگویی برنامه‌ها را بهبود بخشید. به علاوه، این حلقه به توسعه‌دهندگان امکان می‌دهد که با استفاده از توابع callback، promise ها و توابع async، کدی را بنویسند که به رویدادها و ورودی‌های مختلف پاسخ دهد.انواع صف (queue) در حلقه رویدادهادر حلقه رویداد انواع مختلفی از صف‌ها (Queue) وجود دارند که وظیفه مدیریت اجرای کدها و وظایف مختلف را بر عهده دارند. این انواع عبارتند از:صف میکروتسک (Microtask Queue): این صف وظیفه مدیریت اجرای کدهایی را بر عهده دارد که به عنوان میکروتسک (Microtask) شناخته می‌شوند. این کدها معمولاً پس از اجرای کدهای اصلی و قبل از اجرای کدهایی که در Task Queue قرار دارند اجرا می‌شوند.معمولاً میکروتسک‌ها از طریق عملیاتی از جمله Promise callbacks و MutationObserver callbacks ایجاد می‌شوند. این کدها معمولاً کارهایی انجام می‌دهند که به صورت فوری و با اولویت بالا نیاز به انجام دارند، مانند پردازش نتایج یک Promise یا واکشی تغییرات DOM ایجاد شده توسط MutationObserver.صف وظیفه (Task Queue): این صف وظیفه مدیریت اجرای کدها را بر عهده دارد که به عنوان تسک (Task) شناخته می‌شوند. این کدها معمولاً به عنوان پاسخ به وقایعی از جمله اتمام اجرای یک کد، رخدادهای تایمر و درخواست‌های IO (ورودی و خروجی) ایجاد می‌شوند.  به عبارت دیگر، Task Queue کدهایی را که باید پس از اتمام اجرای کدهای فعلی و پس از پردازش ویژگی‌های بلوک کننده مانند setTimeout و setInterval اجرا شوند، نگهداری می‌کند. این کدها معمولاً مربوط به کارهای غیرفوری و مدت زمان بیشتری برای اجرا دارند، مانند درخواست‌های شبکه و عملیات IO دیگر.صف انیمیشن (Animation Frame Queue): این صف وظیفه مدیریت اجرای کدها برای انیمیشن‌ها را بر عهده دارد. این صف به طور خاص برای اجرای کدهایی که باید در هر فریم انیمیشن اجرا شوند، استفاده می‌شود.زمانی که مرورگر آماده است تا یک فریم جدید انیمیشن را نمایش دهد، آن را به عنوان یک اصطلاح و زمان مشخص شده برای اجرای کدهای مربوط به آن ارائه می‌دهد. کدهایی که باید در این فریم انیمیشن اجرا شوند، در صف فریم انیمیشن قرار می‌گیرند و سپس به ترتیب اجرا می‌شوند.با استفاده از صف فریم انیمیشن، می‌توان به طور دقیق و هماهنگ انیمیشن‌های سایت را ایجاد کرد و کدها را در زمان مناسب برای نمایش هر فریم انیمیشن اجرا کرد. این امر بهبود کارایی و پیوستگی انیمیشن‌ها را فراهم می‌کند و تجربه کاربر را بهبود می‌بخشد.منابعhttps://medium.com/@mmoshikoo/event-loop-in-nodejs-visualized-235867255e81https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttickhttps://www.freecodecamp.org/news/node-js-what-when-where-why-how-ab8424886e2</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Thu, 04 Apr 2024 19:13:03 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون توزیع(Distributed Testing): بهبود عملکرد و قابلیت مقیاس‌پذیری</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D8%AA%D9%88%D8%B2%DB%8C%D8%B9distributed-testing-%D8%A8%D9%87%D8%A8%D9%88%D8%AF-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D9%88-%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-%D9%85%D9%82%DB%8C%D8%A7%D8%B3-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-g4vlkeh6rjgr</link>
                <description>آزمون توزیع به عنوان یک راهکار اساسی در زمینه تست عملکرد، به ارزیابی توانایی یک سیستم برای مدیریت افزایش درخواست ها و ترافیک می‌پردازد. این نوع آزمون، در مقایسه با روش‌های سنتی که بر روی یک دستگاه اجرا می‌شوند، از چندین دستگاه یا نود برای اجرای آزمون‌ها بهره می‌برد. در این آزمون رویکرد واقع‌گرایانه‌ تری از سناریوهای واقعی ایجاد می‌ شود و اطمینان حاصل می شود که سیستم تحت شرایط گوناگون، قابلیت پاسخگویی و پایداری را حفظ می‌کند.مزایای آزمونارزیابی قابلیت مقیاس‌پذیری: آزمون توزیع به توسعه‌دهندگان این امکان را می‌دهد که قابلیت مقیاس‌پذیری سیستم خود را به طور دقیقتر و موثرتری ارزیابی کنند. با توزیع بار تست بین چندین نود، توانایی سیستم در مدیریت تعداد زیادی از کاربران یا تراکنش‌های همزمان بررسی می‌شود.توزیع بار: توزیع بار بین چندین نود باعث مدل‌سازی دقیق‌تر الگوهای مورد استفاده واقعی می‌شود. این امر به ارائه نتایج دقیق‌تری از عملکرد سیستم در شرایط مختلف کمک می‌کند.شناسایی جامع خطاها: تست توزیعی در شناسایی خطاها کمک می‌کند که ممکن است فقط در محیط‌ های توزیع شده ظاهر شوند. این خطاها شامل مسائل مرتبط با ارتباط شبکه، همگام‌سازی داده و هماهنگی بین اجزا مختلف سیستم است.ابزارهاچندین ابزار وجود دارد که اجرای تست توزیعی را تسهیل می‌کنند. این ابزارها به توسعه‌دهندگان این امکان را می‌دهند تا سیستم خود را از نظر عملکرد بهینه‌تری بررسی کنند. برخی از این ابزارها عبارت‌اند از:ابزار Apache JMeter: این ابزار توانایی انجام تست توزیعی را دارد و قابلیت‌های گسترده‌ای برای ارزیابی عملکرد سیستم فراهم می‌کند.ابزار Gatling: یک ابزار تست عملکرد با تمرکز بر تست توزیعی است. از زبان Scala برای تعریف سناریوها و شبیه‌سازی بار استفاده می‌کند.ابزار Locust: یک ابزار تست عملکرد با قابلیت توزیع بار است که از زبان Python برای تعریف سناریوها استفاده می‌کند.ابزار K6: این ابزار به توسعه‌دهندگان این امکان را می‌دهد تا تست‌های توزیعی را به راحتی تعریف و اجرا کنند. در این ابزار از زبان JavaScript برای نوشتن اسکریپت‌های تست استفاده می‌کند.پلتفرم BlazeMeter: یک پلتفرم تست عملکرد است که از Apache JMeter استفاده می‌کند و امکان اجرای آزمون توزیع بار را فراهم می‌کند.آزمون توزیع آزمونی حیاتی است که توسعه‌دهندگان را قادر به ارزیابی دقیقق تر عملکرد سیستم در شرایط واقعی می‌کند. با استفاده از ابزارهای مناسب و اجرای آزمون های توزیع، اطمینان حاصل می‌شود که سیستم تحت بار می‌تواند مقیاس‌پذیر و پایدار باشد.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 22 Mar 2024 16:52:37 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون حجم داده (Volume Testing)</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D8%AD%D8%AC%D9%85-%D8%AF%D8%A7%D8%AF%D9%87-volume-testing-izxavzbljgcr</link>
                <description>آزمون حجم داده یک استراتژی حیاتی در عملکرد سیستم‌های نرم‌افزاری است. این تست با ارسال حجم زیادی از داده‌ها به سیستم، عملکرد آن را تحلیل می‌کند. این آزمون از مراحل اساسی در فرآیند تضمین کیفیت نرم‌افزار است. هدف اصلی این آزمون، بررسی قابلیت سیستم در پردازش و مدیریت حجم زیاد داده‌هاست. با اجرای این آزمون می‌توان عملکرد سیستم را در مقابل حجم داده بالا ارزیابی کرده و مشکلات احتمالی را پیش بینی کرد.اهمیت آزموناطمینان از پایداری: آزمون حجم داده اطمینان حاصل می‌کند که سیستم در برابر حجم داده بالا به درستی کار می‌کند و پایداری خود را حفظ می‌کند.شناسایی مشکلات مرتبط با داده: این آزمون به توسعه‌دهندگان این امکان را می‌دهد که مشکلاتی که در پردازش داده‌های حجیم ممکن است پیش بیایند را شناسایی کرده و برطرف کنند.تشخیص خطاها: این آزمون با شناسایی خطاها و مشکلات مرتبط با عملکرد سیستم در مقابل حجم داده بیشتر، اقدامات اصلاحی را تسریع می‌بخشد.روش‌های اجراارسال حجم بالای داده: این روش شامل ارسال حجم زیادی از داده‌ها به سیستم است تا عملکرد آن در شرایط حجم داده بالا بررسی شود.مدیریت حجم داده: تولید و مدیریت داده‌ها در حجم‌های بزرگ برای ایجاد شرایط واقعی‌تر در تست و ارزیابی کارایی سیستم.شبیه‌سازی بار حجیم: با استفاده از ابزارهای شبیه‌سازی، بار حجم داده بالا را بر روی سیستم اعمال کرده و واکنش آن را بررسی می‌کند.ابزارهابرای اجرای آزمون حجم داده، می‌توانید از ابزارهای معتبر و مورد تایید در زمینه تست عملکرد استفاده کنید. برخی از بهترین ابزارها برای تست حجم داده عبارتند از:ابزار Apache JMeter: یک ابزار متن‌باز و قدرتمند برای انجام تست‌ های عملکرد و آزمون حجم داده.ابزار Gatling: یک ابزار تست عملکرد به زبان Scala که برای آزمون حجم داده نیز کارآمد است.سرویس Loader.io: یک سرویس آنلاین که به شما این امکان را می‌دهد تا آزمون حجم داده بر روی سایت خود را انجام دهید.ابزار Locust: یک ابزار متن‌ باز که به شما این امکان را می‌دهد تا آزمون های حجم داده را به سادگی ایجاد و اجرا کنید.سرویس BlazeMeter: یک سرویس تست عملکرد که از Apache JMeter استفاده می‌کند و امکان اجرای آزمون حجم داده را فراهم می‌کندهر کدام از این ابزارها ویژگی‌ها و قابلیت‌های خاص خود را دارند، بنابراین بسته به نیازها و متطلبات خود می‌توانید ابزار مناسبی را انتخاب کنید.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 22 Mar 2024 16:41:09 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون Real-time: افزایش عملکرد نرم‌افزار در زمان اجرا</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-real-time-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%AF%D8%B1-%D8%B2%D9%85%D8%A7%D9%86-%D8%A7%D8%AC%D8%B1%D8%A7-sx4vtb0igsmy</link>
                <description>آزمون Real-time یک نقش حیاتی در اطمینان از پاسخگویی، قابلیت اطمینان، و قابلیت مقیاس‌پذیری نرم‌افزار دارد. آزمون Real-time یک روش است که توانایی یک سیستم در پردازش و پاسخ به ورودی‌ها را به صورت سریع ارزیابی می‌کند، به نحوی که نیازهای سناریوهای واقعی را شبیه‌سازی کند. این نوع تست برای برنامه‌های کاربردی با قابلیت پاسخ لحظه ای مانند سیستم‌های مالی، برنامه‌های بهداشتی، و پلتفرم‌های ارتباطی، حیاتی امری حیاتی است.اهمیت آزمون Real-timeضمانت پاسخگویی: آزمون Real-time تضمین می‌کند که یک برنامه نرم‌افزاری به سرعت به ورودی‌های کاربر پاسخ داده و تجربه کاربری بی‌نقص و کارآمد فراهم می‌کند.حفظ یکپارچگی: در برنامه‌های کاربردی که به سرعت نیازمند اطلاعات جدید یا تغییرات ترافیک هستند، آزمون Real-time یکپارچگی سیستم را حفظ می‌کند.پشتیبانی از محیط‌های پویا: این نوع تست به برنامه‌ها اجازه می‌دهد تا در مقابل تغییرات سریع در محیط واقعی عمل کنند، مانند افزایش ناگهانی ترافیک یا تغییرات در داده‌های ورودی.آزمون Real-time از روش‌های گوناگونی برای ارزیابی عملکرد نرم‌افزار استفاده می‌کند. این تست‌ها باعث بهبود عملکرد سیستم در شرایط واقعی شده و امکان تشخیص و رفع مشکلات در حوزه پاسخگویی سیستم را فراهم می‌کنند.با استفاده از آزمون Real-time، می‌توان از عملکرد بهتر نرم‌افزار در شرایط واقعی اطمینان حاصل کرد و اطمینان حاصل کرد که نرم‌افزار به درستی با تغییرات و نیازهای فوری کاربران سازگار استابزارهابرای پیاده سازی آزمون Real-time، می‌توان از ابزارهای مختلفی استفاده کرد که به توسعه‌دهندگان کمک می‌کنند عملکرد نرم‌افزار را در لحظه اجرا بررسی کنند. در زیر چند ابزار رایج برای تست زمان واقعی آورده شده‌اند:ابزار Apache JMeter: یک ابزار متن‌باز و قدرتمند برای انجام تست‌های عملکرد، از جمله آزمون  می  Real-time می باشد. این ابزار قابلیت شبیه‌سازی تعداد زیادی کاربر را در یک زمان واقعی فراهم می‌کند.ابزار Locust: ابزاری سبک و متن‌باز که به توسعه‌دهندگان این امکان را می‌دهد تا تست‌های ترافیک و عملکرد را بر روی سیستم خود اجرا کرده و نتایج را مشاهده کنند.ابزار Gatling: یک ابزار تست عملکرد با زبان برنامه‌نویسی Scala که قابلیت اجرای آزمون های Real-time را دارد و به توسعه‌دهندگان این امکان را می‌دهد تا عملکرد سیستم خود را ارزیابی کنند.ابزار Artillery: یک ابزار تست عملکرد با زبان جاوااسکریپت که به توسعه‌دهندگان این امکان را می‌دهد تا آزمون های Real-time را بر روی سیستم خود اجرا کرده و نتایج را مشاهده کنند.ابزار Loader.io: یک سرویس آنلاین که به توسعه‌دهندگان این امکان را می‌دهد تا آزمون بار و آزمون Real-time را بر روی برنامه‌های خود اجرا کرده و نتایج را مشاهده کنند.هر کدام از این ابزارها دارای ویژگی‌ها و قابلیت‌های مختلفی هستند، و انتخاب بهترین ابزار بستگی به نیازمندی های پروژه دارد.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 22 Mar 2024 16:32:55 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون Exception راهکاری جهت افزایش اطمینان از عملکرد نرم‌افزار</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-exception-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1%DB%8C-%D8%AC%D9%87%D8%AA-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%A7%D8%B7%D9%85%DB%8C%D9%86%D8%A7%D9%86-%D8%A7%D8%B2-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-tndqluautqmq</link>
                <description>آزمون Exception به شما کمک می‌کند تا عملکرد نرم‌افزار را در شرایط غیرمنتظره و رخداد خطاها ارزیابی کنید. این نوع آزمون از ورودی‌هایی استفاده می‌کند که در شرایط عادی در دسترس نمی باشد همانند داده‌های نامعتبر، خطاها و وضعیت‌های خاص.مراحل اجرای آزمون Exceptionتعریف سناریوها: تعیین حالت‌ها و ورودی‌های غیرمنتظره که ممکن است در زمان اجرا رخ دهند.پیاده‌سازی تست‌ها: ایجاد تست‌های خودکار یا دستی برای اجرای سناریوهای مختلف.اجرا و ثبت نتایج: اجرای تست‌ها و ثبت نتایج در گزارش‌های دقیق.فواید آزمون Exceptionافزایش اعتماد: اطمینان از اینکه نرم‌افزار در مقابل ورودی‌های غیرعادی و غیرمنتظره همچنان صحیح عمل می‌کند.کاهش خطاهای پنهان: شناسایی و حل مشکلاتی که در شرایط خاص پدید می‌آیند.ارتقاء کیفیت نرم‌افزار: ارتقاء قابلیت اطمینان و کارایی نرم‌افزار در شرایط مختلف.با اجرای آزمون Exception نرم‌افزار شما توانایی لازم برای مدیریت ورودی‌ها و وضعیت‌های غیرمنتظره را خواهد داشت و کیفیت عملکرد آن را افزایش خواهید داد.ابزارهابرای انجام آزمون Exception در تست نرم‌افزار از ابزارهای تست خودکار و دستی می‌توانید استفاده کنید. این ابزارها به شما امکان می‌دهند تا سناریوهای مختلف را شبیه‌سازی کرده و عملکرد نرم‌افزار را در شرایط خاص ارزیابی کنید. برخی از ابزارهای معروف در این زمینه عبارتند از:نرم افزار Selenium: یک ابزار معروف تست خودکار برای وب است که از زبان‌های مختلفی از جمله Java و Python  پشتیبانی می‌کند. می‌توانید با Selenium تست‌هایی برای سناریوهای مختلف ایجاد کرده و اجرای خودکار آن‌ها را انجام دهید.ابزار JUnit/TestNG: ابزارهای تست واحد برای Java که قابلیت اجرای تست‌های خودکار را فراهم می‌کنند. با استفاده از آن‌ها می‌توانید تست‌های خود را برای شناسایی خطاها در شرایط نامعمول ایجاد کنید.نرم افزار Postman: یک ابزار تست API است که به شما امکان ارسال درخواست‌های مختلف به سرویس‌های وب را می‌دهد. با استفاده از Postman می‌توانید حالت‌های غیرعادی و وضعیت‌های خطا را برای API خود تست کنید.ابزار Apache JMeter: یک ابزار تست عملکرد متن‌باز است که برای سناریوهای تست مختلف از جمله  ازمون Exception مورد استفاده قرار می‌گیرد. JMeter می‌تواند بارهای زیادی را بر روی سیستم شما اعمال کرده و عملکرد آن را در شرایط استرس بررسی کند.ابزار Fuzz Testing Tools: ابزارهای Fuzz testing مانند American Fuzzy Lop (AFL) یا Peach Fuzzer می‌توانند به صورت تصادفی ورودی‌های مختلف و غیرعادی به نرم‌افزار ارسال کنند تا خطاها و ضعف‌های امنیتی را شناسایی کنند.هنگام انتخاب ابزار به نیازها و ویژگی‌های مورد نظر خود برای تست حالت های غیر معمول توجه کنید و ابزاری را انتخاب کنید که به بهترین شکل با نیازهای شما هماهنگ است.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Sun, 10 Mar 2024 16:05:26 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون تحمل (Endurance Testing)</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D8%AA%D8%AD%D9%85%D9%84-endurance-testing-pe8zdiwncrxm</link>
                <description>آزمون تحمل یا Endurance Testing یکی از جنبه‌های حیاتی در فرآیند تست عملکرد سیستم‌ها است که به بررسی پایداری و عملکرد بلندمدت یک سیستم یا نرم‌افزار می‌پردازد. این نوع تست، قابلیت سیستم در مقابل بار مداوم و با طولانی ترین دوره‌های فعالیت را ارزیابی می‌کند.اهمیت آزمون تحملآزمون تحمل در توسعه نرم‌افزار نقش بسیار مهمی ایفا می‌کند. با اجرای این تست، می‌توان مطمئن شد که سیستم در مدت زمان طولانی استفاده همچنان به طور موثر عمل می‌کند و عملکرد آن تحت بار مداوم بهینه است.نظارت بر منابع: آزمون تحمل به ما این امکان را می‌دهد تا نظارت دقیقی بر منابع سیستم مانند حافظه، پردازنده، و باند‌پهنای شبکه داشته باشیم. این نظارت اطمینان حاصل می‌کند که سیستم تحت بار مداوم قابلیت مدیریت منابع را دارد.شناسایی مشکلات زمانی: آزمون تحمل به تشخیص مشکلات زمانی در سیستم کمک می‌کند. ممکن است در زمان‌های طولانی، خطاهایی که در طول دوره‌های کوتاه آشکار نمی‌شوند، به وجود بیایند. این آزمون به توسعه‌دهندگان این امکان را می‌دهد تا مشکلات پنهان را شناسایی و رفع کنند.بهینه‌سازی عملکرد: از آزمون تحمل می‌توان برای بهینه‌سازی عملکرد سیستم‌ها استفاده کرد. با شناسایی نقاط ضعف و بهبود پاسخگویی در زمان‌های طولانی، سیستم می‌تواند بهترین عملکرد خود را در شرایط مختلف ارائه دهد.نحوه اجرای آزمونبرای اجرای آزمون تحمل، مراحل مشخصی باید انجام شود. ابتدا باید سناریوهای مورد استفاده را تعیین کرده و بر اساس آنها ترافیک پیوسته را ایجاد کنیم. سپس مدت زمان اجرای آزمون و معیارهای اندازه‌ گیری مانند زمان پاسخ و تغییرات در عملکرد را تعیین کنیم.می توان گفت آزمون تحمل به عنوان یکی از ابزارهای اساسی تست عملکرد، نقش حیاتی در اطمینان از پایداری و بهینه‌سازی عملکرد سیستم‌ها دارد. با اجرای این آزمون به صورت دوره‌ای و مداوم، می‌توان به بهبود پایداری و اعتماد به عملکرد سیستم دست یافت.ابزارهای اجرابرای اجرای آزمون تحمل (Endurance Testing)، ابزارهای مختلفی وجود دارند که به شما کمک می‌کنند تا عملکرد بلندمدت سیستم را ارزیابی کنید. در ادامه چند ابزار معروف برای انجام تست معرفی شده است:ابزار Apache JMeter: از قدرتمندترین ابزارهای تست عملکرد است که می‌تواند برای آزمون تحمل نیز به کار رود. با ویژگی‌های توزیع‌ شده و امکانات گزارش‌گیری گسترده، این ابزار قابلیت انجام آزمون‌های تحمل را فراهم می‌کند.ابزارGatling: یک ابزار تست استرس متن‌باز است که همچنین می‌تواند برای آزمون تحمل به‌کار رود. این ابزار با استفاده از زبان DSL امکان اجرای آزمون‌های تحمل را فراهم می‌کند.ابزار k6: یک ابزار تست بار و تست عملکرد متن‌باز است که می‌تواند برای تست تحمل نیز استفاده شود. با اجرای تست‌های توزیع‌ شده و گزارش‌های جذاب، k6 را به ابزاری کارآمد برای انجام آزمون‌های تحمل تبدیل کرده است.ابزار BlazeMeter: یک پلتفرم تست عملکرد مبتنی بر  cloud است که امکانات غنی برای اجرای تست‌های تحمل را فراهم می‌کند. این ابزار از زبان‌های مختلف برنامه‌ نویسی پشتیبانی می‌کند و از ساختارهای مختلف گزارش‌گیری برخوردار است.ابزار LoadRunner: یک ابزار قدرتمند از شرکت Micro Focus است که به شما این امکان را می‌دهد تا تست‌های تحمل را به صورت جزئی یا کامل اجرا کنید. با ویژگی‌های تشخیص خطا و نظارت بر منابع، LoadRunner یک انتخاب معتبر برای آزمون تحمل است.ابزار Artillery: یک ابزار تست بار متن‌باز است که قابلیت اجرای تست‌های تحمل را دارد. با استفاده از اسکریپت‌های YAML، می‌توانید تست‌های تحمل خود را تعریف کرده و اجرا کنید.ابزار Vegeta: یک ابزار تست بار مبتنی بر خط فرمان است که می‌تواند برای تست تحمل استفاده شود.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Thu, 29 Feb 2024 14:16:17 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون استرس(Stress Test)</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D8%A7%D8%B3%D8%AA%D8%B1%D8%B3stress-test-x8clfp5m1wfr</link>
                <description>آزمون استرس یکی از مهمترین تست ها در فرآیند تضمین کیفیت نرم‌افزار است که به توسعه‌دهندگان کمک می‌کند تا از پایداری، قابلیت اطمینان و عملکرد سیستم خود در شرایط حد و حداکثر ممکن مطمئن شوند.آزمون استرس چیست؟آزمون استرس فرآیند سنجش قابلیت یک سیستم در مقابل فشارهای بالا، ناپایداری‌ها، و حجم‌های زیاد داده است. آزمون استرس در محیط‌های واقعی اجرا شده و عملکرد سیستم در مواجهه با شرایط غیرمنتظره را ارزیابی می‌کند.اهمیت آزمون استرستشخیص خطاهای ناشناخته: آزمون استرس ممکن است خطاهایی که در شرایط معمولی ظاهر نمی‌شوند را شناسایی کند و به توسعه‌دهندگان این اطمینان را بدهد که سیستم در مقابل خطاهای ناشناخته مقاوم است.ارتقاء عملکرد: با شناسایی نقاط ضعف عملکردی و بهینه‌سازی سیستم می‌توان عملکرد آن را افزایش داد و قابلیت پاسخگویی به شرایط حداکثری را ازتقاء داد.اطمینان از پایداری: آزمون استرس به توسعه‌ دهندگان اطمینان می‌دهد که سیستم در شرایط حداکثر فشار نه تنها به درستی عمل می‌کند بلکه پایداری لازم را نیز دارد.انواع آزمون استرسآزمون فشار (Pressure Testing): این تست بررسی می‌کند که چگونه سیستم در شرایط حداکثر فشار عمل می‌کند و آیا به درستی به درخواست‌ها پاسخ می‌دهد.آزمون افزایشی (Ramp-up Testing): با افزایش تدریجی تعداد همزمان کاربران یا درخواست‌ها، عملکرد سیستم در مقابل افزایش ترافیک بررسی می‌شود.آزمون استحکام (Endurance Testing): سیستم به مدت طولانی تحت بار قرار می‌گیرد تا عملکرد آن در شرایط طولانی‌مدت بررسی شود.ابزارهانرم افزار Apache JMeter: یک ابزار تست بار متن‌ باز و قدرتمند است که می‌تواند برای آزمون استرس، آزمون بار، و تست عملکرد سیستم‌ها استفاده شود. این ابزار از رابط گرافیکی برخوردار بوده و امکان ضبط و اجرای ترافیک وب را فراهم می‌کند.ابزار Gatling: یک ابزار اجرای آزمون استرس متن‌ باز مبتنی بر Scala است که به صورت توزیع‌شده عمل می‌کند. از زبان DSL برای تعریف آزمون‌ها استفاده می‌کند و قابلیت نظارت بر آزمون‌ها و تجزیه و تحلیل نتایج را داراست.ابزار Artillery: یک ابزار اجرای آزمون استرس متن باز است که از YAML برای تعریف آزمون‌ها استفاده می‌کند. این ابزار توانایی اجرای تست‌های توزیع‌شده و نظارت بر عملکرد سیستم را فراهم می‌کند.ابزار Locust: یک ابزار اجرای آزمون استرس متن‌ باز و مقیاس پذیر است که به زبان Python نوشته شده است. از این ابزار برای تعریف و اجرای آزمون‌های توزیع‌شده و نظارت بر آنها استفاده می‌شود.ابزار Vegeta: یک ابزار اجرای آزمون استرس خط فرمانی است که می‌تواند تعداد زیادی درخواست HTTP را در یک بازه زمانی خاص ارسال کند. این ابزار قابلیت نمودارسازی نتایج را داراست.ابزار Siege: یک ابزار اجرای آزمون استرس خط فرمانی است که می‌تواند تعداد زیادی درخواست HTTP را به یک سرور ارسال کند. این ابزار از قابلیت ضبط ترافیک و تست‌های پویا نیز پشتیبانی می‌کند.هر یک از این ابزارها مزایا و محدودیت‌های خود را دارند، بنابراین انتخاب ابزار مناسب بر اساس نیازها و شرایط پروژه مهم است.آزمون استرس یک جزء حیاتی از فرآیند تضمین کیفیت است که به توسعه‌دهندگان کمک می‌کند عملکرد سیستم را در شرایط حداکثر ممکن ارزیابی کنند. با استفاده از ابزارهای مناسب و اجرای آزمون‌های استرس متنوع، می‌توانید از پایداری و بهینه‌سازی عملکرد سیستم خود اطمینان حاصل کنید.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Sun, 25 Feb 2024 15:02:34 +0330</pubDate>
            </item>
                    <item>
                <title>آزمون بار (Load Testing) ابزاری برای ارتقاء پایداری و عملکرد سیستم</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D8%A8%D8%A7%D8%B1-load-testing-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B1%D8%AA%D9%82%D8%A7%D8%A1-%D9%BE%D8%A7%DB%8C%D8%AF%D8%A7%D8%B1%DB%8C-%D9%88-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-knted89e48ie</link>
                <description>استفاده از API به عنوان یک راه ارتباطی بین برنامه‌ها در توسعه نرم‌افزارها بسیار اهمیت پیدا کرده است. آزمون بار یک ابزار حیاتی است که توسعه‌دهندگان را قادر می‌سازد تا عملکرد پایدار و بهینه‌ای را در مقابل ترافیک بالا و شرایط مختلف ارزیابی کنند.اهمیت آزمون بارشناسایی نقاط ضعف: آزمون بار به توسعه‌دهندگان API این امکان را می‌دهد تا نقاط ضعف سیستم در پاسخگویی به تعداد زیادی از درخواست‌ها را شناسایی و بهبود بخشند.بهبود عملکرد و ارتقاء پایداری: با شبیه‌سازی ترافیک بالا، امکان ارزیابی و ارتقاء پایداری عملکرد API در مقابل شرایط مختلف فراهم می‌شود.مدیریت ترافیک: آزمون بار به توسعه‌دهندگان API اجازه می‌دهد تا توانایی مدیریت ترافیک را برای بهینه‌سازی عملکرد سیستم خود ارتقا دهند.فرآیند انجام آزمون بارتعیین اهداف: توسعه‌دهندگان ابتدا باید اهداف تست را مشخص کنند، از جمله تعداد درخواست‌ها، زمان پاسخ و حداکثر ترافیک مورد نظر.شبیه‌سازی شرایط واقعی: برای ارزیابی واقعی‌تر عملکرد API، باید شرایط ورودی و ترافیک مورد نظر کاملا مشخص باشد و شبیه‌سازی بر اساس آن پارامترها انجام شود.اجرای تست: اجرای آزمون بار تا در مواجهه با تعداد زیادی درخواست، عملکرد و قابلیت پاسخگویی سیستم بررسی شود.تجزیه و تحلیل نتایج: نتایج تست بررسی و تحلیل شده تا نقاط ضعف و مسائل عملکردی شناسایی شوند.بهبود SEOسرعت پاسخ: ارتقاء عملکرد API در نتیجه اجرای آزمون بارسبب بهبود سرعت پاسخ به درخواست‌ها شده و در نتیجه به بهبود رتبه‌بندی در موتورهای جستجو کمک می‌کند.تجربه کاربری: API با عملکرد بهتر در مواجهه با درخواست های زیاد، تجربه کاربری را بهبود می‌بخشد که این موضوع نقش مهمی در SEO دارد.ابزارهای اجرای آزمون بارمی‌توانید از ابزارهایی که بر مبنای npm هستند برای انجام آزمون بار استفاده کنید. این ابزارها را می‌توانید با استفاده از دستور npm install در پروژه خود نصب کنید. در زیر به چند ابزار برای انجام آزمون‌های بار اشاره می‌شود:کتابخانه k6: k6 یک ابزار متن‌باز و توسعه‌پذیر برای انجام آزمون بار است که با زبان JavaScript نوشته شده است.کتابخانه Artillery: Artillery یک ابزار انجام آزمون بار متن باز و مقیاس‌پذیر است که می توانید از YAML برای تعریف آزمون‌ها استفاده کنید.کتابخانه loadtest: loadtest یک ابزار ساده و کم حجم است و برای انجام آزمون‌های بار HTTP طراحی شده است.با نصب هر یک از این ابزارها، می‌توانید با استفاده از دستورات مربوطه و تنظیمات مختلف، آزمون‌های بار خود را اجرا کرده و عملکرد سیستم خود را ارزیابی کنید. برای اطلاعات بیشتر در مورد نحوه استفاده از هر ابزار، به مستندات رسمی آنها مراجعه کنید.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Sun, 18 Feb 2024 20:30:24 +0330</pubDate>
            </item>
                    <item>
                <title>ارزیابی عملکرد API با استفاده از روش‌های متعدد تست</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A7%D8%B1%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-api-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B1%D9%88%D8%B4-%D9%87%D8%A7%DB%8C-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%AA%D8%B3%D8%AA-k4al47wt2cdb</link>
                <description>روندی مهم و حیاتی در تضمین عملکرد بهینه سیستم‌های نرم‌افزاری، انجام تست عملکرد می‌باشد، و این امر برای API نیز اهمیت ویژه‌ای دارد. با پیشرفت روزافزون تکنولوژی و افزایش تقاضا برای اطلاعات، API‌ها به عنوان نقطه ارتباطی بین برنامه‌ها به یکی از عناصر حیاتی در جهان توسعه نرم‌افزار تبدیل شده‌اند. در ادامه، به بررسی اجمالی برخی تست های عملکرد می‌پردازیم.1. آزمون بار (Load Testing):آزمون بار (Load Testing) یک روش تست است که با اجرای همزمان تعداد زیادی درخواست به یک نرم‌افزار یا سرویس، عملکرد آن را در شرایط بار زیاد بررسی می‌کند. هدف اصلی این تست، ارزیابی قابلیت پاسخگویی، ثبات، و کارایی سامانه در مقابل تعداد همزمان بالای درخواست‌ها است. این روش به ما اطلاعات ارزشمندی ارائه می‌دهد درباره میزان حداکثر ترافیکی که یک سامانه می‌تواند مدیریت کند، و نقاط ضعف و تعداد حداکثر همزمان درخواست‌ها را شناسایی می‌کند. با انجام آزمون بار، می‌توان به بهینه‌سازی سامانه و اطمینان از ارتقاء عملکرد در مواجهه با ترافیک متغیر، پرداخت.2. آزمون استرس (Stress Testing):آزمون استرس یک روش تست است که با اعمال فشار و بار بسیار زیاد به سیستم یا API، عملکرد آن را در شرایط حد و حداکثر ممکن بررسی می‌کند. هدف این تست، شناسایی نقاط ضعف، خطاها، و حتی نقاط قوت در زمانی که حجم بار به شدت افزایش می‌یابد، می‌باشد. از این راهکار برای اطمینان از مقاومت و پایداری سیستم در شرایط حداکثر ترافیک استفاده می‌شود. توسعه‌دهندگان با اجرای آزمون استرس می‌توانند مشکلات مربوط به زمان پاسخ، حداکثر ظرفیت و نقاط ضعف سیستم را شناسایی کرده و عملکرد آن را بهینه تر کنند.3. آزمون تحمل (Endurance Testing):آزمون تحمل یا Endurance Testing یک روش تست است که به بررسی پایداری و عملکرد بلندمدت یک سیستم یا نرم‌افزار می‌پردازد. در این نوع تست، سیستم مدت زمان طولانی تحت بار مداوم قرار می‌گیرد تا اطمینان حاصل شود که در طولانی‌ترین زمان ها همچنان به‌طور موثر عمل می‌کند.هدف اصلی Endurance Testing، شناسایی مشکلات عملکردی یا حافظه ای در زمان اجراهای طولانی مدت است. این تست به تاثیر تدریجی بار مداوم بر منابع سیستم و همچنین تشخیص نقاط ضعف در کد و پیکربندی سیستم می‌پردازد. با انجام موفق این تست، اطمینان حاصل می‌شود که سیستم در بازه های زمانی مستمر تحت بار با اطمینان عمل می کند و هیچ تغییرات ناخواسته‌ای در کارایی و عملکرد رخ نمی‌دهد.4. آزمون حالت غیرمنتظره (Exception Testing):آزمون حالت غیرمنتظره یا Exception Testing یک روش مهم در تست عملکرد است که به بررسی عملکرد سیستم در شرایط خطا و پیش بینی نشده می‌پردازد. این تست با ایجاد و شبیه‌سازی ورودی‌ها و حالاتی که اغلب در زمان اجرای واقعی رخ نمی‌دهند، مقاومت و پایداری سیستم را ارزیابی می‌کند. هدف اصلی این تست، اطمینان از عملکرد صحیح و بازدهی سیستم در مقابل خطاها و شرایط پیش‌بینی نشده است. این رویکرد به توسعه‌دهندگان این امکان را می‌دهد که مسائلی که پتانسیل ایحاد خطا دارند را شناسایی و رفع کرده و عملکرد پایدار سیستم را تضمین کنند.5. آزمون بلادرنگ (Real-time Testing):آزمون بلادرنگ یا Real-time یکی از حیاتی‌ترین روش‌های تست پرفورمنس برای سیستم است که به ارزیابی عملکرد آن در شرایط واقعی می‌پردازد. این روش، توانایی سیستم را در ارائه داده‌ها و پاسخ به درخواست‌ها در لحظه‌ی وقوع رویدادهای واقعی، مانند تغییرات ترافیک یا ورود داده‌های جدید، ارزیابی می‌کند. این تست، قابلیت سیستم در حفظ پیوستگی و پاسخگویی مناسب به تغییرات در محیط واقعی را بررسی کرده و مشکلات احتمالی را بهبود می‌بخشد. این رویکرد به توسعه‌دهندگان این امکان را می‌دهد تا اطمینان حاصل کنند عملکرد سیستم آنها با توجه به نیازهای فوری و لحظه ای کاربران حفظ شده است.6. آزمون حجم داده (Volume Testing):آزمون حجم داده یا Volume Testing یک روش مهم در تست است که به بررسی عملکرد سیستم در مقابل حجم داده‌های زیاد می‌پردازد. در این تست، ما با ارسال و دریافت حجم بالای داده به سیستم، قابلیت آن در پردازش و مدیریت داده‌های حجیم را سنجیده و اطمینان حاصل می‌کنیم که عملکرد آن در شرایط باری بالا همچنان بهینه است. آزمون حجم داده باعث تشخیص مشکلات مرتبط با مصرف حافظه، زمان پاسخ، و بهره‌وری عملیات در مقابل داده‌های حجیم می‌شود و به توسعه دهندگان اطمینان می‌دهد که سیستم آنها توانمندی پردازش داده‌های حجیم را داراست.7. آزمون توزیع (Distributed Testing):آزمون توزیع یا Distributed Testing یک روش اساسی در دامنه تست است که از چندین ماشین یا نود برای اجرای تست‌ها استفاده می‌کند. این روش امکان ایجاد بار زیادی را بر روی سیستم فراهم می‌کند و می‌تواند مسائل مرتبط با محیط‌های توزیع شده را شناسایی کرده و بهبودآنها را تسهیل کند. با تخصیص وظایف مختلف به نودها، آزمون توزیع به بهبود قابلیت مقیاس‌پذیری و پایداری عملکرد سیستم کمک می‌کند. این روش به تیم‌های توسعه اجازه می‌دهد تا با محیط‌های واقعی و پیچیده‌تری در تعامل با سیستم ها روبرو شوند و مشکلاتی که فقط در شرایط توزیع شده به وجود می‌آیند، را به دقت شناسایی و رفع کنند.انجام ترکیبی از روش‌های تست برای سیستم به ما اطمینان می‌دهد که سیستم ما به صورت بهینه و با عملکرد بالا عمل می‌کنند. با انجام این تست‌ها، می‌توانیم مسائل مرتبط با پایداری و پاسخگویی را شناسایی کرده و اقدامات اصلاحی لازم را انجام دهیم.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Wed, 31 Jan 2024 23:54:21 +0330</pubDate>
            </item>
                    <item>
                <title>کلاسترها در Node.js: بهبود عملکرد و مقیاس‌پذیری</title>
                <link>https://virgool.io/@afshin.talebi/%DA%A9%D9%84%D8%A7%D8%B3%D8%AA%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-nodejs-%D8%A8%D9%87%D8%A8%D9%88%D8%AF-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D9%88-%D9%85%D9%82%DB%8C%D8%A7%D8%B3-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-mcxahpfedshu</link>
                <description>مقدمهدر واقع Node.js به عنوان یک محیط اجرایی جاوااسکریپت مبتنی بر رویداد (event-driven) با مفهومی غنی از قابلیت‌ها شناخته می‌شود. اما در مقابل افزایش نیازها و تعداد کاربران، مفهومی مانند کلاسترها در Node.js معرفی شده است که امکان بهبود عملکرد و مقیاس‌پذیری برنامه‌های جاوااسکریپتی را فراهم می‌کند. در این پست، به بررسی عمیق‌تری از کلاسترها در Node.js و چگونگی بهره‌گیری از آنها برای توزیع بار و بهبود عملکرد خواهیم پرداخت.مفهوم کلاستر در Node.jsدر Node.js، کلاستر یک الگوی معماری است که امکان اجرای همزمان چند نود را فراهم می‌آورد و توسط یک handler کنترل می‌شود. این نودها به صورت هماهنگ با یکدیگر ارتباط برقرار کرده و به اشتراک منابع و اطلاعات می‌پردازند. هدف اصلی از استفاده از کلاسترها در Node.js، توزیع بار کاری، بهبود عملکرد، و افزایش مقیاس‌پذیری برنامه‌ها است.استفاده از ماژول &#x60;cluster&#x60; در Node.js، این امکان را به برنامه‌نویسان می‌دهد که چندین نود را به صورت همزمان اجرا کرده و آن‌ها را به عنوان یک کلاستر مدیریت کنند، این که باعث بهبود بهره‌وری و افزایش قابلیت پاسخگویی به تغییرات ناشی از افزایش بار شود.استفاده از کلاسترها برای بهبود عملکرداستفاده از کلاسترها در Node.js می‌تواند بهبود عملکرد برنامه‌ها را تسریع بخشد. با افزایش تعداد کاربران و درخواست‌ها، یک نود ممکن است به حداکثر ظرفیت خود برسد و باعث افت کارایی شود. در اینجا کلاسترها به عنوان یک راهکار مؤثر برای بهینه‌سازی و توزیع بار اجرا می‌شوند.با استفاده از ماژول cluster در Node.js، می‌توان چندین نود را به صورت همزمان اجرا کرد و آن‌ها را به عنوان یک کلاستر مدیریت کرد. این امر امکان توزیع بار بین نودها را فراهم می‌کند و بهبود عملکرد سیستم را نمایان می‌سازد.همچنین، کلاسترها در Node.js افزایش قابلیت مقیاس‌پذیری را فراهم می‌کنند. با افزایش تعداد نودها، برنامه به سرعت به نیازهای بیشتر و تعداد کاربران زیاد پاسخ می‌دهد، از این رو اجازه می‌دهد تا به سادگی به چالش‌های مختلف و نیازهای متغیر پاسخ داده شود.در نتیجه، استفاده از کلاسترها در Node.js یک رویکرد موثر برای بهبود عملکرد، توزیع بار، و افزایش مقیاس‌پذیری برنامه‌های جاوااسکریپتی است.پیاده سازی کلاستر در Node.jsراه‌اندازی یک کلاستر در Node.js به کمک ماژول cluster امکان‌پذیر است. این ماژول به برنامه‌نویسان این امکان را می‌دهد تا چندین نود را به صورت همزمان اجرا کرده و آن‌ها را به عنوان یک کلاستر مدیریت کنند. در ادامه، یک کد نمونه برای راه‌اندازی یک کلاستر در Node.js آورده شده است:const cluster = require(&#039;cluster&#039;);
const os = require(&#039;os&#039;);
if (cluster.isMaster) {
 // کد مربوط به نود مستر
 // تعداد هسته‌های موجود در سیستم را دریافت
 const numCPUs = os.cpus().length;
 // برای هر هسته یک نود زیرمجموعه (worker) ایجاد کنید
 for (let i = 0; i &lt; numCPUs; i++) {
    cluster.fork();
  }
 // رصد و مدیریت رخدادهای خروج نودها
cluster.on(&#039;exit&#039;, (worker) =&gt; {
    console.log(`نود ${worker.process.pid} بسته شد`);
    // می‌توانید نودهای بسته شده را دوباره ایجاد کنید
   // cluster.fork();
  });
} else {
 // کد مربوط به نود‌ها
 const express = require(&#039;express&#039;);
 const app = express();
 // تعریف راه‌اندازی وب‌سرور و مسیرها در اینجا
  app.listen(3000, () =&gt; {
      console.log(&#039;سرور در حال اجرا در پورت 3000&#039;);
  });
}در این کد، ابتدا بررسی می‌شود که آیا اجرای برنامه در حالت master است یا خیر. اگر در حالت master باشد، تعداد هسته‌های موجود در سیستم به دست می‌آید و برای هر هسته یک نود زیرمجموعه ایجاد می‌شود. هر نود زیرمجموعه به عنوان یک worker در نظر گرفته می‌شود.سپس، یک handler برای رخدادهای خروج نودها فعال می‌شود. در صورت خروج هر نود، می‌توانید مدیریتی را برای بازسازی و ایجاد نود جدید اعمال کنید.در نهایت، بعد از پیکربندی نود‌ها یک وب‌سرور با استفاده از Express تعریف می کنیم. در بخش تعریف وب سرور می‌توانید تمام مسیرها و تنظیمات مربوط را تعریف کنید.از این مخزن github می توانید نمونه کد چگونگی پیاده سازی کلاسترها را دریافت کنید.جمع‌بندیاستفاده از کلاسترها در Node.js باعث بهبود چشمگیر عملکرد برنامه‌ها می‌شود. یکی از مزایای اصلی این رویکرد، توزیع بار کاری بین چند نود است که باعث افزایش بهره‌وری سیستم و کاهش زمان پاسخ به درخواست‌ها می‌شود. افزایش مقیاس‌پذیری نیز از دیگر مزایای کلاسترهاست؛ امکان افزودن نودها به سادگی، سیستم را قابل توسعه و پاسخگو به نیازهای متغیر می‌سازد.همچنین، مقاومت در برابر خطا از جمله مزایای این رویکرد است. در صورت بسته شدن یک نود، نودهای دیگر به صورت خودکار می‌توانند جایگزین شوند. این امر باعث افزایش پایداری سیستم و اطمینان از ادامه فعالیت بدون اختلال می‌شود. در کل، کلاسترها در Node.js به عنوان یک راهکار مؤثر برای بهینه‌سازی عملکرد، افزایش قابلیت مقیاس‌پذیری، و افزایش اعتبار و پایداری برنامه‌ها شناخته می‌شوند.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Tue, 09 Jan 2024 22:16:59 +0330</pubDate>
            </item>
                    <item>
                <title>از worker thread ها در چه مواقعی باید استفاده کرد؟</title>
                <link>https://virgool.io/@afshin.talebi/%D8%A7%D8%B2-worker-thread-%D9%87%D8%A7-%D8%AF%D8%B1-%DA%86%D9%87-%D9%85%D9%88%D8%A7%D9%82%D8%B9%DB%8C-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D8%B1%D8%AF-mrjyfxzvrwib</link>
                <description>در Node.js یک محیط اجرا single-thread برای اجرای برنامه ها داریم که سبب می شود برنامه هایی که از CPU استفاده زیادی دارند thread اصلی را بلاک کرده و در اجرای برنامه وقفه زمانی ایجاد کنند. کتابخانه worker_threads این مشکل  را با فراهم کردن مکانیسمی برای اجرای کد به صورت موازی با thread اصلی مرتفع کرده است.در پست کار با Worker Thread در Node.js با worker-thread ها و همچنین با نحوه استفاده از آنها در پروژه ها آشنا شدید. در این پست به برخی مزایا و معایب worker-thread ها اشاره می کنیم. همچنین برخی از کتابخانه ها را معرفی می کنیم که کار با worker-thread ها را  برای ما راحت تر می کند.مزایای worker-thread را می توان به این صورت خلاصه کرد:تنها راه حل برای پیاده سازی multithreading در Node.js استفاده از Worker-thread ها است. عملیات های درگیر با CPU، پردازش های background و هر گونه اجرای کد به صورت همزمان (به غیر از اعمال I/O ) نیاز به استفاده از worker-thread ها دارند.استفاده از worker-thread با چندین چالش همراه است که باید قبل از استفاده از worker ها از این موارد آگاه باشید، زیرا در برخی از موقعیت ها نباید از آن استفاده کرد.در واقع Worker thread یک thread واقعی نیستاولین و برجسته ترین محدودیت worker thread ها این است که آنها thread های واقعی نیستند. برنامه های multithreading واقعی امکان اجرای همزمان چندین thread را که داده های یکسانی دارند را فراهم می کنند. در این سناریو، حافظه به روز شده در یک thread برای بقیه thread ها نیز قابل مشاهده خواهد بود و پیاده سازی یک برنامه multithreading نیاز به مدیریت دقیق حافظه برای جلوگیری از ایجاد race condition دارد.در Node.js هنگام کار با worker thread ها  فرآیندهای فرزندی ایجاد می شود که مستقل از کد جاوا اسکریپت در فرآیند اصلی عمل می کنند. در واقع با ایجاد یک محیط ایزوله که بر اساس مفسر V8 جاوا اسکریپت کار می کند. به همین دلیل محیط جدید می تواند برای اجرای یک فایل جاوا اسکریپت خارج از event loop اصلی استفاده شود.از آنجایی که فایل به عنوان یک فرآیند فرزند اجرا می شود، هیچ اشتراک حافظه ای بین برنامه اصلی و worker-thread وجود ندارد. برای رفع این مشکل یک سیستم تبادل داده مبتنی بر رویداد(event) ارائه شده است تا بتوان مقادیر را بین فرآیندها رد و بدل کرد.در نمونه کد زیر می توانید نحوه تبادل داده با استفاده از event را مشاهده کنید:const {
    Worker,
    isMainThread,
    parentPort,
    workerData
} = require(&amp;quotworker_threads&amp;quot);

if (isMainThread) {
    const worker = new Worker(__filename, {workerData: &amp;quothello world!&amp;quot});
    worker.on(&amp;quotmessage&amp;quot, msg =&gt; console.log(`Message received: ${msg}`));
    worker.on(&amp;quoterror&amp;quot, err =&gt; console.error(error));
    worker.on(&amp;quotexit&amp;quot, code =&gt; console.log(`Worker exited with code ${code}.`));
} else {
    const data = workerData;
    parentPort.postMessage(`New data is \&amp;quot${data}\&amp;quot.`);
}عدم ایجاد worker thread های متعددایجاد یک worker-thread مانند ایجاد یک thread جدید در یک زبان multithreading نیست. هر worker-thread یک کپی اختصاصی از مفسر V8 جاوا اسکریپت را اجرا می کند، بنابراین استفاده از تعداد زیاد worker-thread ها منابع قابل توجهی را در هاست شما مصرف می کند.اگرچه worker-thread ها به سرعت شروع به کار می کنند، اما همیشه یک سربار مرتبط وجود دارد. این یک عملیات نسبتاً گران است که worker-thread ها را برای کارهای سبک نامناسب می کند. در واقع بهترین کاندید برای فعالیت های پردازش موازی محدود به CPU می باشند که سبب صرفه جویی بسیار در هزینه ها و سرعت اجرا برنامه می شود.می‌توانید ناکارآمدی‌ها را با استفاده مجدد از مجموعه‌ای از wokret-thread ها کاهش دهید، که به شما امکان می‌دهد از متحمل شدن مداوم هزینه‌های ایجاد worker-thread های جدید جلوگیری کنید. برخی کتابخانه‌ها پیچیدگی مدیریت یک worker-thread آسان تر می‌کنند.از worker-thread ها برای I/O استفاده نکنیدماهیت worker-thread ها به گونه ای است که برای وظایف I/O مناسب نیستند. برای خواندن یک فایل یا واکشی داده‌ها از طریق شبکه، به worker-thread نیازی ندارید – استفاده از توابع داخلی در Node.js برای این منظور بهتر است.مستندات worker_threads به طور خاص توصیه می کند که از ماژول  worker_threads برای این کارها استفاده نکنید. هزینه ایجاد و نگهداری فرآیند worket-thread با مفسر V8 خود بسیار بیشتر از پیاده‌سازی‌های async I/O در Node  است. اگر I/O را با worker-thread پیاده‌سازی کنید، در نهایت به عملکرد نامناسب، هدر دادن منابع و نوشتن کد اضافی منجر می شود.دیباگ worker-thread هامدیریت خطاها در استخرهای worker-thread ممکن است چالش برانگیز باشد زیرا همیشه یک پیوند واضح بین یک رویداد، worker-thread ای که توسط آن مدیریت می شود و اثری که ایجاد می شود وجود ندارد. تلاش برای دیباگ آنچه در حال رخ دادن است با استفاده از دستورات console.log() خسته کننده و مستعد ایجاد خطاهای دیگر است.می‌توانید با ضمیمه کردن یک AsyncResource به استخر، اطلاعات مفیدتری تولید کنید. این اطلاعات امکان بررسی کامل را فراهم می کند که اتفاقات داخل استخر را بررسی کنید و توالی کامل فعالیت هایی را که منجر به وقوع یک خطا می شود را مشاهده کنید.اشتراک گذاری حافظه با استفاده از SharedArrayBuffer نیز ممکن است باعث بروز برخی مشکلات شود. شما باید ازویژگی atomics استفاده کنید یا سیستم مدیریت همزمانی خود را برای جلوگیری از race condition هنگام دسترسی و تغییر حافظه مشترک پیاده سازی کنید. اگر race condition اتفاق بیفتد، می توانند شرایط عجیبی را در برنامه شما ایجاد کند، و اغلب به سختی قابل شناسایی هستند، به خصوص زمانی که به حافظه مربوط می شود که در مکان های مختلف استفاده می شود.چند کتابخانه برای کار با Worker Threadکتابخانه Piscina: مدیریت استخرهای worker-thread را آسانتر می کندکتابخانه Bree: یک job scheduler برای NodeJS می باشدکتابخانه ​​Poolifier: یک کتابخانه دیگر برای مدیریت استخر worker-thread می باشداستفاده از worker thread ها این امکان را به توسعه دهندگان Node.js می دهد که با شروع  پردازش های جدید، کد را به صورت موازی اجرا کنند. این فرآیند یک multithreading واقعی نیست، با این حال هر thread یک فرآیند مستقل است که دسترسی به thread والد خود را ندارد. ارتباط بین thread ها تنها با استفاده از Alocated Shared Memory و یا تبادل داده از طریق رویداد امکان پذیر است.ماژول worker_threads هنوز هم بخشی ارزشمند از اکوسیستم Node.js است. هیچ راه دیگری برای دستیابی به پردازش multithreading و موازی در مواقعی که از جاوا اسکریپت استفاده می کنیم وجود ندارد. با این حال، مهم است که محدودیت‌های worker thread ها  را بشناسید تا بتوانید در مورد موقعیت های استفاده از آنها بهترین تصمیم را داشته باشید. استفاده کردن از worker thread  در موقعیت نامناسب می تواند عملکرد برنامه شما را کاهش دهد و استفاده از منابع را افزایش دهد.</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Sun, 24 Dec 2023 16:11:13 +0330</pubDate>
            </item>
                    <item>
                <title>کار با Worker Thread در Node.js</title>
                <link>https://virgool.io/@afshin.talebi/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-worker-thread-%D8%AF%D8%B1-nodejs-izy7tci8wpxu</link>
                <description>در Node.js یک محیط اجرا با مفسر V8 جاوااسکریپت در دسترس می باشد که به دلیل single-thread بودن اجازه اجرای چندین عملیات به صورت همزمان را نمی‌دهد. اگر برنامه‌ی شما عملیات هایی را به صورت synchronous اجرا می کند ممکن هست برخی درخواست ها در حالت انتظار بماند تا اجرای عملیات های دیگر که ممکن هست مدت زمان بیشتری طول بکشد پایان یابد.با این وجود Node.js یک برنامه multi-thread است. این موضوع زمانی قابل درک هست که از متدهای asynchronous کتابخانه های استاندارد آن استفاده میکنیم برای انجام عملیات هایی از قبیل خواندن یک فایل یا ایجاد یک درخواست شبکه. این عملیات ها به یک استخر جداگانه از thread ها تخصیص داده می‌شوند که Node از کتابخانه libuv زبان C برای ایجاد و نگهداری آنها استفاده می‌کند. با اینکه به نظر می رسد عملیات به صورت multi-thread انجام می شود، اما هنوز امکان دارد که عملیات های asynchronous سبب شود event-loop اصلی بلاک شود.اما اگر بخواهید thread های مستقل را برای برنامه Node.js خود ایجاد کنید چگونه باید عمل کرد؟ multi-threading می‌تواند افزایش بهره‌وری قابل توجهی را برای عملیات های محدود به CPU فراهم آورد و این قابلیت را ممکن می سازد تا عملیات های دلخواه به صورت همزمان انجام شوند. اگرچه Node.js یک multi-threading واقعی را ارائه نمی‌دهد، اما می‌توان چیزی مشابه با آن را با استفاده از ماژول worker_threads ایجاد کنید. این مقاله توضیح می‌دهد که این ماژول چگونه عمل می‌کند و نحوه استفاده از آن در چندین مثال واقعی را نشان می‌دهد.تعریف Worker threadماژول worker_threads شکلی از threading را پیاده سازی می کند که به شما امکان می دهد موازی سازی را به برنامه خود اضافه کنید. کد اجرا شده در یک worker thread در یک فرآیند فرزند(child) جداگانه اجرا می شود و از بلاک کردن event loop اصلی جلوگیری می کند.در واقع worker thread ها thread های واقعی به معنای سنتی نیستند. آنها فرآیندهای مجزا هستند، به این معنی که آنها نمی توانند مستقیماً به محتوای محیط اجرای والد خود دسترسی داشته باشند. ارتباط بین worker thread ها و برنامه شما توسط یک سیستم پیام رسانی مبتنی بر رویداد تسهیل می شود.اگرچه  worker thread ها Node.js را به یک زبان multi-thread واقعی تبدیل نمی کنند. ولی در واقع یک مکانیسم مناسب برای اجرای همزمان چندین threads  را اجرا می کنند و به شما امکان می دهد عملیات های سنگین را از event-loop اصلی جدا کنید.از worker thread در چه مواقعی می توان استفاده کردمی توان worker thread ها را در هر بخشی که شامل عملیات هایی است که استفاده زیادی از CPU می کنند استفاده کرد. آنها برای تسریع عملیات های I/O مناسب نیستند به دلیل سرباری که برای هر thread دارد. توابع کاربردی I/O داخلی Node.js برای انجام عملیات های مرتبط با فایل سیستمی و شبکه سریعتر و کارآمدتر خواهند بود.به طور کلی هیچ محدودیتی از نظر استفاده از worker thread ها وجود ندارد، در ادامه چند مورد استفاده بیان می شود:تغییر ابعاد تصویرفشرده سازی ویدیورمزگذاری فایل و سایر رمزنگاری هامرتب سازی و جستجوی حجم زیادی از داده هاعملیات پیچیده ریاضیکاهش سرعت در تمام این عملیات ها به دلیل صرف زمان زیاد CPU برای اجرای کد است، برخلاف خواندن داده ها از دیسک یا شبکه. این عملیات ها کارهای تکراری هستند، بنابراین افزایش تعداد عملیات ها به صورت موازی بهترین راه حل برای بهبود عملکرد است. Worker-thread ها مکانیزمی برای دستیابی به این هدف است.نحوه استفاده از worker threadsبا وارد کردن ماژول worker_threads و اجرای new Worker() می توانید یک worker thread  ایجاد کنید. به عبارتی دیگر یک فرآیند پردازش جدید برای اجرای یک فایل جاوا اسکریپتی که شما مشخص کرده اید ایجاد می شود. می‌توانید پیغام‌هایی را با worker مبادله کنید تا در صورت وقوع رویدادها، آماده بودن داده‌ها برای پردازش یا بروز خطا، مطلع شوید.کد نمونه:const {
Worker,
    isMainThread,
    parentPort
    workerData
} = require(&amp;quotworker_threads&amp;quot);

if (isMainThread) {
    const worker = new Worker(__filename, {workerData: &amp;quotHello World&amp;quot});
    worker.on(&amp;quoterror&amp;quot, err =&gt; console.error(error));
} else {
    const data = workerData;
    parentPort.postMessage(`You said \&amp;quot${data}\&amp;quot.`);
}این کد ساده تمام اصول اولیه worker thread ها را نشان می دهد. کد می تواند به عنوان thread اصلی یا به عنوان یک worker-thread عمل کند. ماژول worker_threads فلگ isMainThread را در دسترس قرار می دهد که به شما امکان می دهد بررسی کنید که آیا کد توسط thread اصلی اجرا می شود یا خیر.هنگامی که فایل توسط thread اصلی اجرا می شود - یعنی شما فایل را از خط فرمان خود راه اندازی کرده اید و اولین بلاک از دستور if اجرا می شود.برای مطالعه بیشتر در مورد پارامترها می توانید به راهنمای استفاده از worker-thread در سایت nodejs.org مراجعه کنید.کد نمونهبرای بهتر درک کردن نحوه استفاده از worker-thread ها، می‌توانید به نمونه کدی که در مسیر زیر قرار دارد، مراجعه کنید:https://github.com/afshintalebi/nodejs-examples/tree/main/worket-threadدر انتها لازم به یادآوری هست که در NodeJS برنامه به صورت single-thread اجرا می شود و به همین دلیل بعضی مواقع برنامه ممکن است در حین اجرا بلاک شود تا پردازش قبلی بر روی thread اصلی پایان یابد. worker-thread با ایجاد محیطی مشابه کد مورد نظر شما را به صورت همزمان با thread اصلی اجرا می کند و این می تواند در بهبود اجرای برنامه شما بسیار موثر باشد.منابعhttps://nodejs.org/api/worker_threads.htmlhttps://snyk.io/blog/node-js-multithreading-with-worker-threads/</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Wed, 13 Dec 2023 13:06:47 +0330</pubDate>
            </item>
                    <item>
                <title>عملگر in</title>
                <link>https://virgool.io/@afshin.talebi/%D8%B9%D9%85%D9%84%DA%AF%D8%B1-in-savwpqvtf7rd</link>
                <description>عملگر in مقدار true برمی گرداند در صورتی که ویژگی مشخص شده در یک شیء وجود داشته باشد، شیء می تواند یک object یا array باشد. در ذیل چند مثال از نحوه استفاده ذکر شده است.با استفاده از in می توانیم بررسی کنیم که آیا یک اندیس در object وجود دارد یا خیر:“hello” in {“hello”: “Hello”, “world”:”World”} // true
“Hello” in {“hello”: “Hello”, “world”:”World”} // falseاگر از in به همراه آرایه استفاده شود اندیس های آرایه مورد بررسی قرار می گیرد و مقادیر را در بررسی ها نادیده می گیرد:&amp;quotHello” in [“Hello”,”World”] // false
0 in [“Hello”,”World”] // true
1 in [“Hello”,”World”] // true
2 in [“Hello”,”World”] // falseاز in می توانید برای بررسی ویژگی های خاص که به صورت عمومی در یک نوع داده وجود دارند استفاده کرد، مثلا در داده آرایه ویژگی هایی همانند length،  map و … هست که می توانیم با این عملگر وجود آنها را بررسی کنیم:“map” in [] // true
“map” in [“Hello”,”World”] // true
“length” in [“Hello”,”World”] // true
“object” in [] // falseاز in می توانید وجود ویژگی های prototype و constructor را در object هایی که دارای تابع ساختار(constructor) هستند بررسی کنیم:“constructor” in object //true
“prototype” in object //true</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 31 Jan 2020 20:00:33 +0330</pubDate>
            </item>
                    <item>
                <title>داده Symbol در javascript</title>
                <link>https://virgool.io/@afshin.talebi/%D8%AF%D8%A7%D8%AF%D9%87-symbol-%D8%AF%D8%B1-javascript-gfoi5ijavqlx</link>
                <description>جاوا اسکریپت از هفت نوع داده اصلی(primitive) پشتیبانی می کند:  string, number, bigint, boolean, null, undefined و symbol . در میان این نوع داده ها شاید کمتر در مورد Symbol شنیده باشید.داده Symbol برای ایجاد کلید های یکتا مورد استفاده قرار گیرد و دارای متدهای استاتیک و یک ساختار  object داخلی است. این نوع داده فاقد constructor می باشد و امکان استفاده از new برای ایجاد شیء symbol ممکن نمی باشد.const symObj = new Symbol(‘chars’);اجرای عبارت بالا سبب ایجاد خطا از نوع type می شود.برای ایجاد کلید یکتا می توانیم از symbol به صورت زیر استفاده کنیم:const symObj = Symbol(‘chars’);نکته: کلیدهایی که با symbol ایجاد می شوند هرگز یکسان نخواهند بود حتی اگر رشته یکسان تعریف داده شده باشد.Symbol(‘chars’) === Symbol(‘chars’) // print falseتعریف ویژگی خصوصی برای objectیکی از موارد استفاده از symbol  آن است که می تواند برای تعریف ویژگی های خصوصی در object ها استفاده شود.const sym1 = Symbol(“A”);
const sym2 = Symbol(“B”);
const sym3 = Symbol(“C”);
const newObj = {
    “hello”: “Hello World”,
    [sym1]: “Hello”,
    [sym2]: “World”,
};
newObj[sym3] = “Bye World”;در صورت چاپ کردن متغیر newObj مقدار آن به همراه کلیدهای symbol نمایش داده می شود.console.log(newObj);
/*
* hello: &amp;quotHello World&amp;quot
* Symbol(A): &amp;quotHello&amp;quot
* Symbol(B): &amp;quotWorld&amp;quot
* Symbol(C): &amp;quotBye World&amp;quot
*/چند نکته در مورد object هایی که دارای کلیدهای symbol هستند:1- ویژگی های object که از نوع symbol هستند در Object.entries, Object.keys و سایر حلقه های تکرار همانند for...in نمایش داده نمی شوند:console.log(Object.entries(newObj));
// (2) [“hello”, “Hello World”]همچنین در متد JSON.stringify نیز نمایش داده نمی شوند:console.log(JSON.stringfy(newObj));
// {“hello”: “Hello World”}2- با استفاده از متد Object.getOwnPropertySymbols می توانیم ویژگی های object که از نوع  symbol هستند را در خروجی نمایش دهیم:console.log(Object.getOwnPropertySymbols(newObj));
/*
*  (3) [Symbol(A), Symbol(B), Symbol(C)]
*     0: Symbol(A)
*     1: Symbol(B)
*    2: Symbol(C)
*/3- با استفاده از دو متد Symbol.for و Symbol.keyFor می توانیم برای رشته های همسان مورد استفاده در Symbol یک کلید یکسان تولید کنیم.const sym1 = Symbol.for(“A”);
const sym2 = Symbol.for(“A”);
let newObj = {[sym1]: “Hello”};

newObj[sym2] += “ World”;
console.log(newObj[sym1]); // print “Hello World”</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 24 Jan 2020 14:06:48 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت اعلان متغیر با let &amp; var &amp; const در دامنه global در javascript</title>
                <link>https://virgool.io/@afshin.talebi/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A7%D8%B9%D9%84%D8%A7%D9%86-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1-%D8%A8%D8%A7-let-var-const-%D8%AF%D8%B1-%D8%AF%D8%A7%D9%85%D9%86%D9%87-global-sb2by5ik0g8k</link>
                <description>کلمه کلیدی this در بالاترین سطح به شیء window اشاره می کند. زمانی که برای تعریف متغیر به صورت global از کلمه کلیدی var استفاده می کنید آن متغیر از طریق  شیء window نیز در دسترس می باشد. اما زمانی که از کلمه های کلیدی let و یا const استفاده می کنیم متغیرها دیگر از طریق شیء window در دسترس نمی باشند.var a = “A”;
let b = “B”;
const c = “C”;

console.log(this.a); // “A”
console.log(window.a); // “A”
console.log(this.b); // undefined
console.log(b); // “B”
console.log(this.c); // undefined
console.log(c); // “C”</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Sun, 19 Jan 2020 23:10:40 +0330</pubDate>
            </item>
                    <item>
                <title>ضمیمه کردن فایل class (با ساختار ES6) در HTML</title>
                <link>https://virgool.io/@afshin.talebi/%D8%B6%D9%85%DB%8C%D9%85%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D8%A7%DB%8C%D9%84-class-%D8%A8%D8%A7-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-es6-%D8%AF%D8%B1-html-ah0pafmp375h</link>
                <description>برای استفاده از  class که در آن از export استفاده شده است باید ویژگی type در تگ script را با مقدار module مشخص کنید. با مشخص کردن این ویژگی در داخل تگ script می توانیم از ساختار import برای ضمیمه کردن class مورد نظر استفاده کنیم:&lt;script type=”module”&gt;
import {Capture} from ‘./camera.js’;
var capture = new Capture();
ضمیمه کردن فایل js به صورت پویااز نسخه ES10 به بعد می توانیم فایل های js را تنها در صورتی که مورد نیاز است به صفحه ضمیمه کرده و مورد استفاده قرار دهیم:document.querySelect(“#button”).addEvenetListener(“click”, async ()=&gt; {
    const camera = await import(‘./camera.js’);
    camera.Capture.get();
})</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 17 Jan 2020 19:24:53 +0330</pubDate>
            </item>
                    <item>
                <title>مروری بر event های DOMContentLoaded و window.onload</title>
                <link>https://virgool.io/@afshin.talebi/%D9%85%D8%B1%D9%88%D8%B1%DB%8C-%D8%A8%D8%B1-event-%D9%87%D8%A7%DB%8C-domcontentloaded-%D9%88-windowonload-w24tsx18mxpj</link>
                <description>رویداد  DOMContentLoadedاین  event پس از بارگذاری کامل ساختار DOM اجرا می شود. در تابع ارسال شده می توانید عملیات هایی از قبیل خواندن/افزودن/ویرایش/حذف عناصر DOM را انجام دهید. اگر با jQuery کار کرده باشید این event معادل jQuery.ready می باشد.function afterLoaded () {
    console.log(‘DOM is loaded’)
};
document.addEventListener(“DOMContentLoaded”,afterLoaded);ویژگی readyStateاین ویژگی وضعیت بارگذاری صفحه را اعلام می کند. با هر تغییر در مقدار این ویژگی یک event با نام readystatechange فراخوانی می شود. این ویژگی می تواند دارای یکی از مقادیر زیر باشد:loading: این مقدار نشان می دهد که صفحه هنوز در حال بارگذاری می باشد.Interactive: این مقدار نشان می دهد که صفحه بارگذاری شده و ساختار DOM برای انجام عملیات های مورد نظر در دسترس می باشد اما برخی عناصر مانند تصاویر، فایل های css، فریم ها و … هنوز در حال بارگذاری می باشد.complete: این مقدار نشان می دهد که صفحه به طور کامل بارگذاری شده است.document.addEventListener(&#039;readystatechange&#039;, event =&gt; {
    if (event.target.readyState === &#039;loading&#039;) {
        console.log(‘page is loading..’);
    } else if (event.target.readyState === &#039;interactive&#039;) {
        console.log(‘DOM tree has been loaded’);
    } else if (event.target.readyState === &#039;complete&#039;) {
        console.log(Page has been loaded completely’);
    }
});رویداد این  event در بالاترین سطح و بعد از بارگذاری کامل صفحه اجرا می شود. به عبارتی دیگر این صفحه بعد از بارگذاری کامل ساختار DOM، تصاویر، اسکریپت ها، فریم ها و… اجرا می شود و برای موقعیت هایی که مدنظر داریم عملیات خاصی را بعد از بارگذاری کامل صفحه انجام دهیم این event می تواند مورد استفاده قرار گیرد. این event معادل jQuery.load می باشد.function pageLoaded () {
    console.log(&amp;quot{age has been loaded&amp;quot);
}
 = pageLoaded;لینک های راهنما:https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_eventhttps://developer.mozilla.org/en-US/docs/Web/API/Document/readyStatehttps://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 17 Jan 2020 19:16:15 +0330</pubDate>
            </item>
                    <item>
                <title>مروری بر برخی متدهای Console</title>
                <link>https://virgool.io/coderlife/%D9%85%D8%B1%D9%88%D8%B1%DB%8C-%D8%A8%D8%B1-%D8%A8%D8%B1%D8%AE%DB%8C-%D9%85%D8%AA%D8%AF%D9%87%D8%A7%DB%8C-console-mgpgujgiphcq</link>
                <description>کنسول یک ابزار پر استفاده برای توسعه دهندگان است. به وسیله Console می توانید برنامه های خود را به سادگی عیب یابی کنید و از عملکرد آنها اطمینان حاصل کنید. این object دارای متد های متفاوتی برای اشکال زدایی می باشد که می تواند روند خطا زدایی در برنامه را تسریع کند. در ادامه کاربرد برخی از مهم ترین متدها را شرح می دهیم.متد console.logاین متد برای چاپ کردن مقادیر متغیرها یا سایر عبارات، مقادیر مشخص شده به صورت مستقیم در خروجی کنسول استفاده می شود. بر اساس نوع متغیر خروجی متفاوت می باشد. برای مثال می توانید عبارات زیر را در کنسول مرورگر اجرا کنید تا خروجی ها را مشاهده کنید:const a={hello: “Hello”, world: “World”};
console.log(a) ;

const b=”Hello World”;
console.log(b) ;متد console.dirاین متد عملکردی شبیه به متد log دارد با این تفاوت که بر اساس نوع داده ساختار را به صورت درختی نمایش می دهد. با اجرای فرمان های زیر در کنسول مرورگر می توانید تفاوت آن ها را مشاهده کنید:const a=[‘Hello’,’World’];
console.log(a) ;
console.dir(a) ;

const b={hello: “Hello”, world: “World”};
console.log(b) ;
console.dir(b) ;متد console.errorاز این متد می توان برای موقعیت هایی که می خواهیم یک خطا را در کنسول نمایش دهیم استفاده کنیم، فرض کنید هنگامی که در حال اجرای یک api هستید و به علتی در ارتباط با سرور api خطایی رخ داده است با این متد می توانیم پیغام خطا را در کنسول نمایش دهیم. یکی از ویژگی های این متد آن است که محلی که این متد در کد برنامه  فراخوانی شده است را نمایش می دهد(stack trace).console.error(“Error in calling API”)متدهای console.time و console.timeEndاز این متدها می توان برای محاسبه میزان زمان سپری شده بین اجرای یک بخش کد یا فراخوانی های توابع استفاده کرد. از این متدها می تواند برای سنجش میزان بهینه بودن کد استفاده کرد.console.time();
const count = 5000;
let sum = 0;
for(let i=0;i&lt;=count;i=i+1) {
    sum += i;
}
console.timeEnd();متد console.clearاین متد کلیه مقادیر چاپ شده قبلی در کنسول را پاک می کند.console.clear();متد console.tableاین متد مقادیر را در یک ساختار جدول نمایش می دهد. این متد در برخی مرورگرهای قدیمی ممکن است پشتیبانی نشود.const a = [1,2,3,4,5];
console.table(a);متد copyاین تابع مقادیر را در حافظه کپی می کند و می توان از آن مقدار برای عملیات مورد نظر خود استفاده کنیم.const a={hello: “Hello”, world: “World”};
copy(a);لیست کاملی از متدهای آبجکت console را می توانید در لینک زیر مشاهده کنید:https://www.w3schools.com/jsref/obj_console.asp</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Tue, 14 Jan 2020 18:15:05 +0330</pubDate>
            </item>
                    <item>
                <title>حذف مقادیر falsy از آرایه در ES6</title>
                <link>https://virgool.io/@afshin.talebi/%D8%AD%D8%B0%D9%81-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-falsy-%D8%A7%D8%B2-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%AF%D8%B1-es6-ghv551anlndv</link>
                <description>راه های مختلفی برای حذف مقادیر falsy از آرایه وجود دارد، برای مثال با استفاده از  for، for...in، forEach , filter می توان این عملیات حذف  را انجام داد. اما ساده ترین راه که درگیر پیچیدگی های الگوریتم پیاده سازی نشویم کدام است؟ساختار الگوریتم:حذف تمام مقادیر falsy از  آرایهمقادیر falsy در جاوااسکریپت شامل null, undefined, &#x27;&#x27;, false, Nan و 0 می باشدتبدیل مقادیر به مقدار Booleanمقادیر مورد تست:نمونه [1, null, 2, 4, &#x27;&#x27;, undefined, 6] که باید آرایه [1,2,4,6] را برگرداندنمونه [&#x27;Hello&#x27;, &#x27;&#x27;, null, 0, &#x27;world&#x27;, undefined, NaN, false] که باید مقدار [&#x27;Hello&#x27;, &#x27;world&#x27;] را برگرداندنمونه [0, NaN, null, undefined] که آرایه خالی [] بر می گرداندنمونه [&#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;] که همان مقادیر را بدون تغییر بر می گرداندنمونه [&#x27;a&#x27;, 1, null, &#x27;b&#x27;, 0, 2, &#x27;c&#x27;, false] که باید مقدار [&#x27;a&#x27;, 1,&#x27;b&#x27;,2,&#x27;c&#x27;] را برگرداندبهترین راه حل:بهترین شیوه برای حذف مقادیر falsy استفاده از متد filter هست. این متد یک تابع به عنوان ورودی گرفته و آن را برای هر عنصر آرایه فراخوانی می کند. در تابع ارسالی به این متد می توانیم شرط خود برای بررسی مقدار را درج کرده و در نهایت مقدار true/false برگردانیم که در صورت true بودن عنصر جاری به آرایه جدید اضافه می شود.مثال (دمو آنلاین):// remove falsy elements
const removeFalsyElements = items =&gt; items.filter(element =&gt; !!element)

console.log(removeFalsyElements([1, null, 2, 4, &#039;&#039;, undefined, 6]));
console.log(removeFalsyElements([&#039;Hello&#039;, &#039;&#039;, null, 0, &#039;world&#039;, undefined, NaN, false]));
console.log(removeFalsyElements([0, NaN, null, undefined]));
console.log(removeFalsyElements([&#039;a&#039;, &#039;b&#039;, &#039;c&#039;]));
console.log(removeFalsyElements([&#039;a&#039;, 1, null, &#039;b&#039;, 0, 2, &#039;c&#039;, false]));نکته: برای تبدیل مقادیر مختلف به مقدار Boolean می توانیم از دو روش استفاده کنیم:۱. استفاده از تابع Boolean(): با ارسال مقدار مورد نظر به این تابع با توجه به تابع ارسالی مقدار true/false برگردانده می شود:Boolean(value);۲. استفاده از عملگر( ! ): در صورتی که قبل از مقدار مورد نظر دو علامت !! بگذارید تبدیل به مقدار boolean می شود.!!value&lt;br/&gt;</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 03 Jan 2020 23:23:25 +0330</pubDate>
            </item>
                    <item>
                <title>پیمایش عناصر object در javascript</title>
                <link>https://virgool.io/@afshin.talebi/%D9%BE%DB%8C%D9%85%D8%A7%DB%8C%D8%B4-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-object-%D8%AF%D8%B1-javascript-db5ie1svha8e</link>
                <description>به احتمال بسیار عناصر یک آرایه را با استفاده از ساختارهای تکرار مانند for، foreach و… پیمایش کرده اید، آرایه هایی که می توانند شامل عناصر مختلف از نوع رشته، اعداد، آبجکت و ... باشند اما اگر بخواهیم عناصر یک object را پیمایش کنیم و به آنها دسترسی داشته باشیم نمی توانیم از for، foreach، map و… استفاده کنیم. برای این حالت در javascript سه متد وجود دارد که با استفاده از آنها می توانیم عناصر یک آبجکت را پیمایش نمائیم.Object.keys()Object.entries()For...inساختار Object.keysاین ساختار اندیس های‌ یک object را بر اساس ترتیب آن در یک آرایه بر می گرداند و سپس از این آرایه می توان در حلقه های  تکرار استفاده کرده و به مقادیر متناظر آن در object را دسترسی پیدا کرد.const object = { 
    a: &#039;hello&#039;,
    b: ‘world’,
    c: ‘!’
};
const properties = Object.keys(object);
console.log(properties);
properties.forEach(property=&gt;{
    console.log(object[property]);
})ساختار Object.entriesاین ساختار عناصر object را در یک آرایه چند بعدی برمی گرداند. به عبارتی وقتی از این متد استفاده می کنم اندیس و مقدار هر عنصر object در یک آرایه ذخیره شده و در قالب یک آرایه کلی برگردانده می شود.const object = {
    a: &#039;hello&#039;,
    b: ‘world’,
    c: ‘!’
};
const data = Object.entries(object);
console.log(‘All data: ’, data);
for( let [key, value] of data) {
    console.log(`${key}: ${value}`);
}ساختار For...inاین ساختار تکرار برای پیمایش object ها استفاده می شود، در هر تکرار اندیس object در متغیر مشخص شده برگردانده می شود و می توانیم از آن برای دسترسی به مقادیر object استفاده کنیم.const object = {
    a: &#039;hello&#039;,
    b: ‘world’,
    c: ‘!’
};
for( let key in object) {
    console.log(object[key]);
}</description>
                <category>افشین</category>
                <author>افشین</author>
                <pubDate>Fri, 03 Jan 2020 23:07:44 +0330</pubDate>
            </item>
            </channel>
</rss>