<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Hossein Shahmohammadi</title>
        <link>https://virgool.io/feed/@HShah</link>
        <description>من می‌دانم که هیچ نمی‌دانم.</description>
        <language>fa</language>
        <pubDate>2026-04-15 00:19:10</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/200359/avatar/Nh8CD1.jpg?height=120&amp;width=120</url>
            <title>Hossein Shahmohammadi</title>
            <link>https://virgool.io/@HShah</link>
        </image>

                    <item>
                <title>بازگشت به دنیای هوش مصنوعی: مسیر یادگیری Data Science، Machine Learning و Deep Learning</title>
                <link>https://virgool.io/Rocket/return-to-the-world-of-ai-a-learning-path-in-data-science-machine-learning-and-deep-learning-xicdoemtsg6j</link>
                <description>سلام دوستان گلم حسین هستم و برگشتم!پس از یک سالی که دور بودم از نوشتن به دلایل مهاجرت و این داستان ها، دوباره دوست دارم برگردم و این بار میخوام بیشتر رو مبحث هوش مصنوعی زوم کنم یعنی با تمرکز رو این فیلد بنویسم؛ هر چیزی که یک نفر برای یادگیری در این حوزه نیاز داره رو میخوام توضیح بدم البته بنظرم این نوشته‌ها بیشتر به درد کسانی میخوره که میخوان تو حوزه مهندسی این بخش ورود کنن یعنی بخش Data Science ، Machine Learning ، Deep Learning همچنین اضافه کنم که این حوزه خیلی بزرگه و منم دوست دارم با نوشتن در مورد هوش مصنوعی و هرچی پیرامونش هستش به دانش خودمم افزوده کنم!هدفم اینه که بتونم در اینجا هر از چند روزی یکبار یک مقاله آموزشی به اشتراک بزارم و بتونم کمک خوبی به دوستان علاقه مند به هوش مصنوعی کنم.برنامه چیه؟ چیکار میخوای کنی؟وقتی راجب آموزش هوش مصنوعی تو گوگل سرچ میکنی خیلی به محتواهای زرد برخورد میکنی، که این داستان کمک که نمیکنه هیچ... آدم رو از کاری که میخواد انجام بده هم دلسرد میکنه. برای همین میخوام با یک مسیر یادگیری اصولی این کارو انجام بدم و از یک رود مپ (نقشه راه) خیلی خوب استفاده کنم و در کنارش هر منبعی که فکر میکنم خوبه رو پیدا کنم و ازش کمک بگیرم و خوشحال میشم دوستانی که این مطالب رو میخونن هم با نظرای خوبشون باعث دلگرمی بنده بشن. همین! دوستتون دارم :)نقشه راه هوش مصنوعیبرای شروع باید از مباحث پایه شروع کنیم که مباحث رو به ترتیب می‌نویسم:Fundamentals (اصول اولیه)در این بخش، مفاهیم پایه‌ای که باید برای ورود به حوزه داده‌ها و هوش مصنوعی یاد بگیرید، ذکر شده‌.1.1 Basics (مبانی)Matrices &amp; Linear Algebra Fundamentals: آشنایی با ماتریس‌ها و جبر خطی برای کار با داده‌های ساختار‌یافته و مدل‌های ریاضی.Database Basics: یادگیری اصول اولیه پایگاه‌های داده.Tabular Data: کار با داده‌های جدولی (مثل اکسل و پایگاه داده‌های SQL).Data Frames &amp; Series: کار با ساختارهای داده‌ای مثل DataFrame و Series در ابزارهایی مثل Pandas.ETL (Extract, Transform, Load): یادگیری فرایندهای استخراج، تبدیل و بارگذاری داده‌ها.Reporting &amp; Vis Analysis: تحلیل و گزارش‌گیری از داده‌ها با استفاده از ابزارهای بصری‌سازی.Data Formats: آشنایی با فرمت‌های مختلف داده (مثل JSON، XML، CSV).Regular Expressions (RegEx): یادگیری الگوهای متنی برای جستجو و ویرایش داده‌های متنی.1.2 SQL Basicsآشنایی با پایگاه داده‌های رابطه‌ای و کار با دستورات SQL برای ذخیره و بازیابی داده‌ها از منابع مختلف (PostgreSQL، SQLite، MySQL).2. Python Programming (برنامه‌نویسی پایتون)Python Basics: یادگیری اصول اولیه پایتون شامل متغیرها، توابع و ساختارهای کنترلی.Important Libraries: آشنایی با کتابخانه‌های مهم پایتون مثل Numpy و Pandas.Virtual Environments: استفاده از محیط‌های مجازی برای مدیریت پروژه‌های پایتون.Jupyter Notebooks: استفاده از Jupyter Notebook برای تست و اجرای کدها.3. Data Sources (منابع داده)Data Mining: یادگیری روش‌های استخراج داده از منابع مختلف.Web Scraping: تکنیک‌های استخراج داده از وب‌سایت‌ها.Awesome Public Datasets: آشنایی با دیتاست‌های عمومی برای تمرین (مثل دیتاست‌های Kaggle).4. Exploratory Data Analysis / Data Munging - Wrangling (تحلیل اکتشافی داده و پاکسازی)Principal Component Analysis (PCA): کاهش ابعاد داده‌ها برای ساده‌تر کردن تحلیل.Dimensionality &amp; Numericity Reduction: کاهش پیچیدگی داده‌های عددی و ابعادی.Normalization: نرمال‌سازی داده‌ها برای ایجاد تعادل بین مقادیر.Data Sampling &amp; Handling Missing Values: مدیریت مقادیر از دست رفته و نمونه‌برداری از داده‌ها.Unbiased Estimators: تخمین‌گرهای بی‌طرف برای مدل‌سازی بهتر.Blending System Values: ترکیب داده‌ها برای افزایش دقت مدل‌ها.Feature Extraction: استخراج ویژگی‌های مهم از داده‌ها.Denoising: کاهش نویز در داده‌ها.Sampling: نمونه‌برداری از داده‌ها برای کارایی بیشتر در تحلیل‌ها.5. Data Scientist &amp; Data Engineer (دانشمند داده و مهندس داده)این مسیر در نهایت به دو شاخه کلی منجر می‌شه:Data Scientist: فردی که بیشتر روی تحلیل داده‌ها و مدل‌سازی آماری تمرکز می‌کنه.Data Engineer: کسی که زیرساخت‌ها و ابزارهای لازم برای کار با داده‌های بزرگ را طراحی و مدیریت می‌کنه.این نقشه راه، گام به گام شما را از مبانی اولیه تا مهارت‌های پیشرفته‌تر هدایت می‌کند.در روز های آینده به ترتیب این مباحث رو به صورت کلی مورد بررسی قرار میدم.</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Thu, 26 Sep 2024 04:18:14 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش ساخت توکن ERC20 شخصی در بلاکچین اتریوم</title>
                <link>https://virgool.io/Solidity/tutorial-on-making-personal-erc20-token-in-ethereum-blockchain-xbzwsoe85vzk</link>
                <description>ساختن یک توکن (Token) در بلاکچین به شما این امکان را می‌دهد که یک رمزارز خودساخته با نام و نماد خودتان را ایجاد کنید. این کار می‌تواند برای پروژه‌هایی که به دنبال جمع‌آوری سرمایه هستند، مفید باشد. در ادامه، مراحل ساخت یک توکن در بلاکچین را شرح می‌دهیم:1. ایجاد یک کیف پول (Wallet):قبل از هرچیز، برای ذخیره توکن‌های خود باید یک کیف پول بلاکچین بسازید. برای این کار، می‌توانید از کیف پول‌های سخت‌افزاری یا نرم‌افزاری مانند MyEtherWallet یا MetaMask استفاده کنید.2. انتخاب بلاکچین:باید تصمیم بگیرید که بر روی کدام بلاکچین قصد ساخت توکن خود را دارید. برای مثال، می‌توانید بر روی بلاکچین Ethereum یا Binance Smart Chain (BSC) توکن خود را ایجاد کنید.3. طراحی توکن:حال باید توکن خود را طراحی کنید. برای این کار، باید از یک قالب استاندارد مانند ERC-20 برای Ethereum و BEP-20 برای BSC استفاده کنید. این قالب‌ها برای ساخت توکن‌های قابل تعامل با دیگر توکن‌ها و دارایی‌های بلاکچین طراحی شده‌اند.4. ایجاد کد توکن:بعد از طراحی توکن، باید کد توکن را برای بلاکچین خود ایجاد کنید. برای این کار، می‌توانید از زبان‌های برنامه‌نویسی مانند Solidity برای Ethereum وابسته به BSC استفاده کنید. این کد شامل جزئیاتی مانند نام توکن، نماد، مقدار سهامداری، توکن‌های اولیه، توکن‌های قابل تبدیل و قیمت توکن می‌باشد.5. مستندات توکن:بعد از ایجاد کد توکن، باید مستندات توکن را برای کاربران خود ایجاد کنید. این مستندات شامل جزئیاتی مانند نحوه خرید و فروش توکن، موجودی کیف پول، قیمت و نمودارهای توکن است.6. انتشار توکن:بعد از تکمیل مراحل بالا، کد توکن را برای بلاکچین خود ارسال کنید و توکن خود را منتشر کنید. برای این کار، می‌توانید از سرویس‌های مانند Remix و Truffle برای Ethereum و PancakeSwap برای BSC استفاده کنید.7. توزیع توکن:حالا که توکن شما منتشر شده است، می‌توانید آن را به افراد دیگری توزیع کنید. برای این کار، می‌توانید از روش‌هایی مانند فروش توکن در صرافی‌های رمزارز، توزیع توکن به صورت رایگان به کاربران جامعه و یا استفاده از ابزارهای تبلیغاتی برای جذب سرمایه‌گذاران استفاده کنید.در نهایت، باید توجه داشت که ساخت یک توکن در بلاکچین نیاز به دانش فنی و تخصصی دارد و برای جلوگیری از خطرات امنیتی و مشکلات قانونی، بهتر است با کارشناسان بلاکچین و رمزارزها همراه باشید.آموزش ساخت توکن ERC20 در بلاکچین اتریمبرای ساخت یک توکن در بلاکچین، ما در این آموزش از استاندارد ERC-20 در شبکه Ethereum استفاده می‌کنیم. ERC-20 یک استاندارد توکن برای شبکه‌های مبتنی بر Ethereum است که به شما این امکان را می‌دهد تا توکنی با قوانین و توابع مشخص خود بسازید.1. نصب کیت توسعه Truffle:برای شروع، ابتدا باید کیت توسعه Truffle را نصب کنید. این ابزار به شما امکان می‌دهد تا قراردادهای هوشمند را به راحتی بسازید و تست کنید. برای نصب Truffle، دستور زیر را در ترمینال یا کامند پرامپت وارد کنید:npm install -g truffle2. ایجاد پروژه Truffle:پس از نصب Truffle، یک پروژه جدید ایجاد کنید:mkdir MyToken
cd MyToken
truffle init3. نصب OpenZeppelin:برای ساخت توکن ERC-20، ما از کتابخانه OpenZeppelin استفاده می‌کنیم. OpenZeppelin شامل قراردادهای هوشمند قابل اعتماد و امن است که برای ساخت توکن‌ها و دیگر برنامه‌های بلاکچینی استفاده می‌شود. برای نصب OpenZeppelin، دستور زیر را وارد کنید:npm install @openzeppelin/contracts4. ایجاد قرارداد هوشمند توکن ERC-20:پس از نصب OpenZeppelin، یک فایل جدید به نام &#x60;MyToken.sol&#x60; در پوشه &#x60;contracts&#x60; ایجاد کنید و کد زیر را در آن قرار دهید:soliditypragma solidity ^0.8.0;

import &amp;quot@openzeppelin/contracts/token/ERC20/ERC20.sol&amp;quot

contract MyToken is ERC20 {
    constructor(uint256 initialSupply) ERC20(&amp;quotMyToken&amp;quot, &amp;quotMTK&amp;quot) {
        _mint(msg.sender, initialSupply);
 }
}5. تنظیم فایل truffle-config.js:فایل &#x60;truffle-config.js&#x60; را تنظیم کنید تا به شبکه‌ی توسعه (development network) متصل شود. می‌توانید از شبکه‌ی Ganache یا شبکه‌ی پیشفرض Truffle استفاده کنید.javascriptmodule.exports = {
    networks: {
        development: {
              host: &amp;quot127.0.0.1&amp;quot,
              port: 7545, // برای Ganache یا پورت دیگری که شبکه‌ی توسعه شما در آن قرار دارد
              network_id: &amp;quot*&amp;quot,
        },
    },
    compilers: {
        solc: {
              version: &amp;quot0.8.0&amp;quot,
        },
    },
};6. استقرار قرارداد هوشمند:فایل جدیدی به نام &#x60;2_deploy_contracts.js&#x60; در پوشه‌ی &#x60;migrations&#x60; ایجاد کنید و کد زیر را در آن قرار دهید:javascriptconst MyToken = artifacts.require(&amp;quotMyToken&amp;quot);

module.exports = function (deployer) {
deployer.deploy(MyToken, &amp;quot1000000000000000000000000&amp;quot); // 1 میلیون توکن با 18 رقم اعشار7. استقرار قرارداد هوشمند:ترمینال یا کامند پرامپت را باز کرده و دستور زیر را وارد کنید تا قرارداد هوشمند را استقرار دهید:truffle developپس از اتصال به شبکه‌ی توسعه، دستور زیر را وارد کنید:migrate8. تست کردن توکن:در ترمینال Truffle، می‌توانید توکن خود را تست کنید. برای مثال، می‌توانید تعداد توکن‌های اولیه را چک کنید:let instance = await MyToken.deployed()
let balance = await instance.balanceOf(accounts[0])
console.log(balance.toString())اگر همه چیز به درستی کار کرده باشد، می‌بینید که تعداد توکن‌های اولیه در حساب کاربری اول شما قرار دارد.تبریک! شما به‌طور موفقیت‌آمیز یک توکن ERC-20 در بلاکچین ایجاد کردید. می‌توانید با استفاده از قرارداد هوشمند خود توکن‌ها را به دیگران انتقال دهید، تعداد توکن‌های کاربران را بررسی کنید و دیگر عملیات‌های مربوط به توکن را انجام دهید.چگونه می‌توانم توکن خود را به صرافی‌های رمزارز اضافه کنم؟برای اضافه کردن توکن خود به صرافی‌های رمزارز، باید ابتدا مطمئن شوید که توکن شما قابل تبادل است و برای آن یک عنوان (Ticker) و یک آدرس قرار داده شده است.سپس برای اضافه کردن توکن خود به صرافی‌های رمزارز، می‌توانید از دو روش زیر استفاده کنید:1. درخواست از صرافی:شما می‌توانید با ارسال یک درخواست به صرافی مورد نظر، توکن خود را برای اضافه کردن به صرافی ارائه دهید. برای این کار، بهتر است به وب سایت صرافی مورد نظر بروید و فرم درخواست اضافه کردن توکن را پر کنید. درخواست شما به دلیل بارگذاری بالای صرافی و همچنین بررسی‌های امنیتی، ممکن است زمان بر باشد.2. اضافه کردن توکن به صرافی‌های دارای پشتیبانی از توکن‌های خودکار:بسیاری از صرافی‌ها از تکنولوژی توکن‌های خودکار (ERC-20 برای Ethereum و BEP-20 برای Binance Smart Chain) پشتیبانی می‌کنند. این یعنی صرافی‌ها به صورت خودکار توکن‌هایی که توسط کاربران بر روی بلاکچین آن‌ها ایجاد شده‌اند، شناسایی و به کیف پول کاربران اضافه می‌کنند. بنابراین، برای اضافه کردن توکن خود به صرافی، اگر صرافی شما از توکن‌های خودکار پشتیبانی می‌کند، کافی است که آدرس توکن خود را به کیف پول صرافی اضافه کنید و توکن خود به صورت خودکار به کیف پول شما اضافه خواهد شد.در هر صورت، برای اطمینان از اضافه شدن توکن شما به کیف پول صرافی، بهتر است با صرافی مورد نظر تماس بگیرید و از ایجاد توکن در صرافی اطمینان حاصل کنید.</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Sat, 17 Jun 2023 18:27:01 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی ارتباط بلاکچین و هوش مصنوعی</title>
                <link>https://virgool.io/Solidity/blockchain-and-artificial-intelligence-i8kv0pr3xw4u</link>
                <description>ارتباط بین بلاکچین و هوش مصنوعی از دو جهت قابل بررسی است. از یک سو، این دو فناوری می‌توانند با هم ترکیب شوند و یکپارچه شوند و از طرف دیگر، هر کدام از این فناوری‌ها می‌تواند به توسعه و بهبود دیگری کمک کند.در مورد ترکیب بلاکچین و هوش مصنوعی، استفاده از بلاکچین می‌تواند به بهبود عملکرد هوش مصنوعی منجر شود. به طور مثال، کاربرد بلاکچین در جمع‌آوری و ذخیره داده‌ها، به هوش مصنوعی کمک می‌کند تا به داده‌های بیشتری دسترسی پیدا کند و از آنها برای آموزش خود استفاده کند. همچنین، با استفاده از بلاکچین، می‌توان بهبود امنیت و حفاظت از داده‌ها در هنگام استفاده از هوش مصنوعی را فراهم کرد.از سوی دیگر، هوش مصنوعی می‌تواند به بهبود عملکرد بلاکچین کمک کند. به طور مثال، با استفاده از هوش مصنوعی، می‌توان الگوریتم‌های بهینه‌سازی برای پردازش تراکنش‌های بلاکچین طراحی کرد و از آنها برای بهبود کارایی و سرعت بلاکچین استفاده کرد. همچنین، با استفاده از هوش مصنوعی، می‌توان بهبود فرآیندهای تشخیص تغییرات در بلاکچین و تشخیص تراکنش‌های مشکوک به کمک الگوریتم‌های یادگیری ماشینی فراهم کرد.بنابراین، با توجه به اینکه بلاکچین و هوش مصنوعی هر کدام دارای مزایا و معایب خود هستند، ترکیب این دو فناوری می‌تواند به بهبود عملکرد و کارایی سیستم‌ها و برنامه‌های مختلف منجر شود.با توجه به مزایایی که بلاکچین و هوش مصنوعی دارند، از ترکیب این دو فناوری می‌توان در بسیاری از صنایع و بخش‌ها بهره برد. به عنوان مثال، در صنعت بیمه، از بلاکچین برای ذخیره سازی داده‌های بیماری‌ها و محاسبه بیمه‌ها و از هوش مصنوعی برای تحلیل این داده‌ها و پیش‌بینی محتمل‌ترین بیماری‌ها و روش‌های پیشگیری استفاده می‌شود. از طرفی، با استفاده از بلاکچین، اطلاعات بیمه‌ای بیماران به صورت امن و مطمئن ذخیره می‌شود و با استفاده از هوش مصنوعی، می‌توان بهبود پویایی و کارایی این سیستم‌ها را فراهم کرد.همچنین، در حوزه تجارت الکترونیک، ترکیب بلاکچین و هوش مصنوعی می‌تواند به بهبود امنیت و کارایی پرداخت‌های آنلاین کمک کند. با استفاده از بلاکچین، تراکنش‌های مالی به صورت شفاف و امن ذخیره می‌شوند و با استفاده از هوش مصنوعی، می‌توان الگوریتم‌هایی را برای تحلیل این داده‌ها و تشخیص تراکنش‌های مشکوک طراحی کرد.در حوزه حمل و نقل هم، با استفاده از بلاکچین، اطلاعاتی مانند تاریخچه وضعیت و موقعیت بارها به صورت دقیق و شفاف ذخیره می‌شوند و با استفاده از هوش مصنوعی، می‌توان الگوریتم‌هایی را برای بهینه سازی مسیر حمل بار و جلوگیری از تأخیرهای ناشی از ترافیک طراحی کرد.بنابراین، ترکیب بلاکچین و هوش مصنوعی می‌تواند در بسیاری از صنایع و بخش‌ها به بهبود کارایی، امنیت و کاربردی بودن سیستم‌ها و برنامه‌ها کمک کند.آیا بلاکچین و هوش مصنوعی می‌توانند در حوزه‌های دیگری به کار گرفته شوند؟بله، بلاکچین و هوش مصنوعی قابلیت کاربرد در حوزه‌های بسیاری را دارند و می‌توانند در صنایع مختلفی از جمله بهداشت، حمل و نقل، کشاورزی، مالی، مدیریت زنجیره تأمین، امنیت و غیره به کار گرفته شوند. در ادامه، برخی از کاربردهای بلاکچین و هوش مصنوعی در حوزه‌های دیگر را ذکر می‌کنیم:1- بهداشت: بلاکچین و هوش مصنوعی می‌توانند در جمع‌آوری و تحلیل داده‌های پزشکی، تشخیص بیماری‌ها، تحلیل داده‌های ژنتیکی و تشخیص سریع بیماری‌ها و موارد دیگر به کار گرفته شوند.2- حمل و نقل: بلاکچین و هوش مصنوعی می‌توانند به منظور بهبود امنیت و کیفیت حمل و نقل، پیش‌بینی ترافیک، بهینه سازی مسیرها و کاهش هزینه‌های حمل و نقل به کار گرفته شوند.3- کشاورزی: بلاکچین و هوش مصنوعی می‌توانند در بهبود کیفیت محصولات کشاورزی، رصد محصولات و تشخیص بیماری‌ها و آفات، مدیریت منابع آبی و بهبود سیستم‌های زراعی به کار گرفته شوند.4- مدیریت زنجیره تأمین: بلاکچین و هوش مصنوعی می‌توانند به منظور بهبود شفافیت، ردیابی و کنترل کیفیت محصولات، بهبود مدیریت زنجیره تأمین و کاهش هزینه‌های زنجیره تأمین به کار گرفته شوند.5- امنیت: بلاکچین و هوش مصنوعی می‌توانند در پیشگیری از جرائم سایبری، تشخیص تقلب و تهیه اسناد تقلبی، بهبود امنیت شبکه‌های ارتباطی و کاهش هزینه‌های مرتبط با امنیت به کار گرفته شوند.به طور کلی، بلاکچین و هوش مصنوعی به دلیل قابلیت‌هایی که دارند، می‌توانند در حوزه‌های بسیاری از جمله بهداشت، حمل و نقل، کشاورزی، مدیریت زنجیره تأمین، امنیت و غیره به کار گرفته شوند و بهبود قابل توجهی در عملکرد و کارایی این صنایع ایجاد کنند.آیا استفاده از بلاکچین و هوش مصنوعی، هزینه‌های بالایی دارد؟استفاده از بلاکچین و هوش مصنوعی ممکن است در برخی موارد هزینه‌های بالایی داشته باشد، اما در بسیاری از موارد، می‌تواند به توفیر هزینه‌های قابل توجهی برای سازمان‌ها و شرکت‌ها منجر شود.در مورد بلاکچین، استفاده از آن می‌تواند به کاهش هزینه‌های واسطه‌های مالی، بهبود امنیت تراکنش‌ها، کاهش هزینه‌های مربوط به تایید تراکنش‌ها و غیره منجر شود. همچنین، به دلیل استفاده از پایگاه داده توزیع شده، امکان دسترسی به اطلاعات در سطح جهانی بدون نیاز به واسطه‌های مالی وجود دارد که می‌تواند هزینه‌های مربوط به واسطه‌ها را به طور قابل ملاحظه‌ای کاهش دهد.در مورد هوش مصنوعی، استفاده از آن ممکن است به دلیل نیاز به سرمایه‌گذاری در تحقیق و توسعه، طراحی سیستم‌های مختلف و آموزش الگوریتم‌ها هزینه‌هایی داشته باشد. اما در عوض، استفاده از هوش مصنوعی می‌تواند به بهبود کارایی و کاهش هزینه‌های مربوط به تصمیم‌گیری‌های انسانی، بهبود دقت تصمیم‌گیری و پیش‌بینی، بهبود برنامه‌ریزی و مدیریت منابع منجر شود.بنابراین، در کل، استفاده از بلاکچین و هوش مصنوعی ممکن است در برخی موارد هزینه‌های بالایی داشته باشد، اما با توجه به بهره‌هایی که این فناوری‌ها دارند، می‌توانند به توفیر هزینه‌های منابع، بهبود عملکرد و افزایش سودآوری سازمان‌ها و شرکت‌ها منجر شوند.</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Sat, 17 Jun 2023 17:10:32 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی کامل پروتکل احراز هویت کربوس Kerberos</title>
                <link>https://virgool.io/Rocket/kerberos-vxblcr61hnj6</link>
                <description>در عصر جدید همه مردم و به ویژه کسب‌و‌کارها خواهان یک ارتباطات امن هستند. هر روز به تعداد سازمان‌هایی که ترجیح می‌دهند از زیرساخت‌های شبکه برای انجام فعالیت‌های تجاری خود استفاده کنند افزوده می‌شود. عامل اصلی برای ایمن‌سازی ارتباطات در زیرساخت‌های توزیع شده، احراز هویت و حصول اطمینان از این مسئله است که من همان شخصی هستم که ادعا می‌کنم.دانشمندان علوم کامپیوتر دانشگاه MIT، اولین پژوهشگرانی بودند که از واژه Kerberos (یکی از قهرمان اساطیر یونانی) برای نام‌گذاری یک پروتکل احراز هویتی استفاده کردند که درون شبکه‌های کامپیوتری استفاده می‌شود. Kerberos (Kerberos) یک پروتکل تحت شبکه است که در سطحی گسترده برای حل مشکل احراز هویت استفاده می‌شود. Kerberos از رمزنگاری کلید متقارن و یک مرکز توزیع کلید KDC سرنام Key Distribution Center استفاده می‌کند و برای احراز هویت کاربر به مجوز ثالث مورد اعتماد نیاز دارد. Kerberos به 3 عنصر مجزا برای احراز هویت نیاز دارد و از یک سیستم رهگیری و نظارتی قدرتمند برای امن‌تر نگه داشتن محاسبات استفاده می‌کند.کربروس Kerberos چیست؟Kerberos یک پروتکل برای احراز هویت درخواست‌های سرویس بین میزبانان قابل اعتماد در یک شبکه ناامن مانند اینترنت است. پشتیبانی از Kerberos در تمامی سیستم‌عامل‌های کامپیوتری اصلی از جمله مایکروسافت ویندوز، اپل  macOS، فری‌بی‌اس‌دی و لینوکس وجود دارد.از ویندوز ۲۰۰۰ به بعد، مایکروسافت از پروتکل Kerberos به عنوان روش احراز هویت پیش‌فرض در ویندوز استفاده می‌کند و این بخشی از سرویس Active Directory (AD) ویندوز است. ارائه دهندگان خدمات پهنای باند همچنین از این پروتکل برای احراز هویت مودم‌های کابلی و جعبه‌های بالا‌برنده استفاده می‌کنند.Kerberos برای پروژه Athena در موسسه فناوری ماساچوست (MIT) توسعه داده شد. نام آن از اساطیر یونانی گرفته شده است؛ Kerberos (Cerberus) سگی با سه سر بود که دروازه‌های هادز را نگه می‌داشت. سه سر پروتکل Kerberos عبارتند از:1. مشتری یا اصلی2. منبع شبکه، که سرور برنامه است که دسترسی به منبع شبکه را فراهم می‌کند3. مرکز توزیع کلید (KDC)، که به عنوان خدمات احراز هویت شخص ثالث اعتماد Kerberos عمل می‌کند.کاربران، سیستم‌ها و خدماتی که از Kerberosاستفاده می‌کنند، تنها باید بهKDC اعتماد کنند. این به عنوان یک فرآیند تکی اجرا می‌شود و دو خدمت را فراهم می‌کند: خدمات احراز هویت و خدمات اخذ بلیط (TGS).&quot;بلیط‌های&quot; KDC احراز هویت متقابل را فراهم می‌کنند، به نحوی که گره‌ها می‌توانند هویت خود را به یکدیگر به صورت امن ثابت کنند. احراز هویت Kerberos از رمزنگاری اشتراکی معمول استفاده می‌کند تا از خواندن یا تغییر بسته‌هایی که در شبکه جابجا می‌شوند جلوگیری شود. همچنین، پیام‌ها را از هک و حملات بازپخش محافظت می‌کند.کار روی Kerberos در دهه ۱۹۸۰ شروع شد. نسخه ۵ از پروتکل - نسخه فعلی - در سال ۱۹۹۳ برای اولین بار منتشر شد. کنسرسیوم Kerberos MIT در سپتامبر ۲۰۰۷ برای توسعه فناوری تأسیس شد. در سال ۲۰۰۵، گروه کاریابی مهندسی اینترنت پروتکل Kerberos را به عنوان استاندارد پیشنهادی در درخواست برای نظرات ۴۱۲۰ منتشر کرد. در سال ۲۰۱۳، کنسرسیوم گسترده و به نام کنسرسیوم MIT Kerberos and Internet Trust تغییر نام داد.پروتکل احراز هویت Kerberos چه کار می‌کند؟هدف اصلی Kerberos، فراهم کردن روشی برای احراز هویت امن کاربران شبکه MIT به سیستم‌هایی بود که نیاز داشتند از آن‌ها استفاده کنند. همچنین، این اجازه را به کاربران می‌دهد تا به سیستم‌های مورد نظرشان دسترسی داشته باشند.در آن زمان، سیستم‌های شبکه اغلب با ترکیبی از شناسه کاربری و رمز عبور، کاربران را احراز هویت می‌کردند. سیستم‌ها به طور معمول رمزعبور را &quot;به صورت روشن&quot; یعنی بدون رمزگذاری ارسال می‌کردند. حمله‌کنندگان با دسترسی به شبکه، می‌توانستند به راحتی بر روی انتقالات شبکه گوش دهند، شناسه کاربری و رمز عبور را از بین ببرند و سپس سعی کنند به سیستم‌هایی که مجوز دسترسی ندارند دسترسی پیدا کنند.توسعه‌دهندگان Kerberos به دنبال فراهم کردن یک پروتکل احراز هویت شبکه بودند که برای احراز هویت میزبانان قابل اعتماد در حال ارتباط در شبکه‌های ناامن مانند اینترنت استفاده شود. به ویژه، آن‌ها قصد داشتند یک مکانیزم برای احراز هویت دسترسی به سیستم‌ها را در شبکه باز - اینترنت - فراهم کنند.Kerberos ابتدا به عنوان &quot;سیستم احراز هویت و اختیار دسترسی Kerberos&quot; در یک مقاله با همین نام نوشته شده توسط S.P. Miller، B.C. Neuman، J.I. Schiller و J.H. Saltzer طراحی شد. طراحان هدف از احراز هویت Kerberos را به عنوان یک روش برای پشتیبانی از اختیار دسترسی تعریف کردند. در حالی که یک کاربر ممکن است به عنوان دارای حق دسترسی به برخی منابع شبکه شناخته شود، ابزارهای اختیار دسترسی به منابع خاصی مانند فضای ذخیره سازی و پایگاه داده را فراهم می‌کنند.همچنین، Kerberos برای ارتباط با سیستم‌های حسابداری امن طراحی شده است. این سومین &quot;A&quot; از سه عامل احراز هویت، اختیار دسترسی و حسابداری (AAA) است.اهداف، مفاهیم و اصطلاحات Kerberosاهداف سیستم Kerberos در یک آموزش توسطFulvio Ricciardi از موسسه ملی فیزیک هسته‌ای در لچه، ایتالیا شرح داده شده است. این اهداف شامل موارد زیر است:· رمز عبورها هرگز بر روی شبکه ارسال نمی‌شوند.· رمز عبورها بر روی سیستم‌های کاربر ذخیره نمی‌شوند و بلافاصله پس از استفاده حذف می‌شوند.· رمز عبورها هرگز در قالب متن ساده ذخیره نمی‌شوند، حتی بر روی سرورهای احراز هویت.· هر کاربر تنها یکبار در هر جلسه رمز عبور خود را وارد می‌کند. این یک نوع اولیه از احراز هویت یک بار ورود (SSO) است و به این معناست که کاربران تنها یکبار خود را احراز هویت می‌کنند، اما هنوز می‌توانند به هر سیستمی که مجوز دسترسی دارند دسترسی پیدا کنند.· تمام اطلاعات احراز هویت در یک سرور احراز هویت متمرکز نگهداری می‌شود. سرورهای برنامه نویسی خود هیچ گونه اطلاعات احراز هویت را نگهداری نمی‌کنند. این ویژگی‌ها را فراهم می‌کند:o یک مدیر می‌تواند اجازه دسترسی کاربر به هر سرور برنامه را از سرور احراز هویت متمرکز غیرفعال کند. دسترسی به سرورهای فردی برای لغو اجازه لازم نیست.o یک رمز عبور کاربر کافی است برای دسترسی به تمام سرویس‌های احراز هویت شده Kerberos. یک کاربر می‌تواند رمز عبور خود را فقط یکبار تنظیم کند، بدون در نظر گرفتن تعداد سرویس‌هایی که مجوز دسترسی دارد.o حفاظت از اطلاعات کاربر ساده شده است زیرا تمام اطلاعات احراز هویت کاربر در یک سرور احراز هویت متمرکز ذخیره می‌شود، نه بر روی تمام سرورهای فردی که کاربر مجوز دسترسی دارد.· تمام افراد - کاربران و همچنین سرورهای برنامه - باید هنگام درخواست احراز هویت خود را احراز هویت کنند. کاربران هنگام ورود به سیستم خود را احراز هویت می‌کنند. سرویس‌های برنامه ممکن است مجبور شوند خود را به کلاینت احراز هویت کنند.· Kerberos یک مکانیزم برای برقراری یک مدار رمزگذاری شده بین کلاینت و سرور فراهم می‌کند تا ارتباطات شبکه خصوصی باشند.سه مجموعه مختلف از موجودیت‌ها از Kerberos استفاده می‌کنند:1. اصول Kerberos. هر هویت منحصر به فردی که Kerberos می‌تواند برای آن یک بلیت اختصاص دهد. برای بیشتر کاربران، یک اصلی با شناسه کاربری یکسان است. این شامل میزبان‌ها و سرویس‌هایی است که می‌توانند بلیت Kerberos را دریافت کنند. مشتریان فردی یک نوع از اصلی‌های Kerberos هستند. اصلی سرویس یک هویت است که به یک سرویس برنامه‌ای اختصاص داده شده است که از طریق Kerberos دسترسی پیدا می‌کند. یک اصلی با حداقل سه قطعه اطلاعات منحصر به فرد شناسایی می‌شود:a. برای کاربران، اصلی اولیه یک نام کاربری است. برای میزبان‌ها، اصلی کلمه میزبان است. برای سرویس‌ها، نام سرویس نام اصلی است.b. شناسه اختیاری اصلی معمولاً نام میزبان سیستمی که اصلی با آن ارتباط دارد را مشخص می‌کند.c. سرورهای Kerberos در یک منطقه شبکه محدود به نام قلمرو عمل می‌کنند. قلمروها با نام دامنه سیستم‌های نام دهیDNS شناسایی می‌شوند. قلمری کاربر نام دامنه است که در آن سرور Kerberos عمل می‌کند.2. سرورهای برنامه‌ای  Kerberos. هر سیستمی که دسترسی به منابع نیاز به احراز هویت کاربر از طریق Kerberos دارد. به عنوان مثال، سرویس‌های برنامه‌ای می‌توانند شامل خدمات پرونده و چاپ، شبیه‌سازی ترمینال، محاسبات از راه دور و پست الکترونیک باشند.3. KDC Kerberos.  فرایند احراز هویت با Kerberos بر اساس اجزایKDC زیر وابسته است:a. پایگاه داده Kerberos. این یک رکورد برای هر اصلی در قلمرو حفظ می‌کند. این مخزن مرکزی برای اطلاعات احراز هویت Kerberos است. شامل اطلاعات شناسایی اصلی و سیستم‌ها و سرویس‌هایی است که آن اصلی مجوز دسترسی به آن‌ها را دارد.b. سرویس احراز هویت Kerberos. مشتریان شبکه برای احراز هویت خود و دریافت یک بلیت مجوز دسترسی (TGT)، همچنین به عنوان بلیت احراز هویت شناخته می‌شوند، از این سرویس Kerberos استفاده می‌کنند.c. سرویس درخواست بلیت Kerberos. این سرویس Kerberos TGT را قبول می‌کند تا کاربران بتوانند به سرویس‌های برنامه‌ای خود دسترسی پیدا کنند.احراز هویت با Kerberos بر اساس استفاده از بلیت‌های احراز هویت است. یک بلیت احراز هویت نشان می‌دهد که کاربر از طریق سرویس احراز هویت Kerberos احراز هویت شده است. پس از دریافت آن، کاربر می‌تواند درخواست بلیت‌های دیگر را برای دسترسی به سرویس‌های برنامه‌ای خاص ارسال کند.چگونه پروتکل احراز هویت Kerberos کار می‌کند؟توصیف ساده شده‌ای از روند کارKerberos در زیر آمده است؛ البته فرایند واقعی پیچیده‌تر است و ممکن است در اجرای مختلف متفاوت باشد:1. درخواست سرور احراز هویت. برای شروع فرآیند احراز هویت کاربرKerberos، کاربر مبدا یک درخواست احراز هویت به سرور احراز هویت KDC Kerberos ارسال می‌کند. درخواست اولیه احراز هویت به صورت متن ساده ارسال می‌شود زیرا هیچ اطلاعات حساسی در درخواست وجود ندارد. سرور احراز هویت بررسی می‌کند که کاربر در پایگاه داده KDC وجود دارد و کلید خصوصی کاربر مبدأ را بازیابی می‌کند.2. پاسخ سرور احراز هویت. اگر نام کاربری کاربر مبدأ در پایگاه دادهKDC یافت نشود، کاربر نمی‌تواند احراز هویت شود و فرآیند احراز هویت متوقف می‌شود. در غیر این صورت، سرور احراز هویت یکTGT و یک کلید جلسه به کاربر ارسال می‌کند.3. درخواست بلیت سرویس. پس از احراز هویت توسط سرور احراز هویت، کاربر یک درخواست بلیت سرویس از TGS می‌کند. این درخواست باید با TGT ارسال شده توسط سرور احراز هویت KDC همراه باشد.4. پاسخ بلیت سرویس. اگر TGS بتواند کاربر را احراز هویت کند، اعتبارنامه و بلیت دسترسی به سرویس درخواست شده را به کاربر ارسال می‌کند. این انتقال با یک کلید جلسه خاص برای کاربر و سرویس دسترسی داده شده رمزگذاری شده است. این مدرک اثبات هویت برای دسترسی به سرویس &quot;Kerberized&quot; درخواست شده استفاده می‌شود. این سرویس درخواست اصلی را تأیید کرده و سپس هویت خود را به سامانه درخواست دهنده تأیید می‌کند.5. درخواست سرور برنامه‌ای. کاربر یک درخواست برای دسترسی به سرور برنامه‌ای ارسال می‌کند. این درخواست شامل بلیت سرویس دریافت شده در مرحله 4 است. اگر سرور برنامه‌ای بتواند این درخواست را احراز هویت کند، کاربر می‌تواند به سرور دسترسی پیدا کند.6. پاسخ سرور برنامه‌ای. در مواردی که کاربر درخواست احراز هویت سرور برنامه‌ای را دارد، این پاسخ لازم است. کاربر قبلاً خودش را احراز هویت کرده است و پاسخ سرور برنامه‌ای شامل احراز هویت Kerberos سرور است.نحوه احراز هویت یک کلاینت با Kerberos برای دسترسی به سرور برنامهبلیط سرویسی که توسطTGS ارسال می‌شود، به کلاینت اجازه دسترسی به سرویس را می‌دهد. بلیط سرویس دارای زمان‌بندی است، بنابراین یک بلیط می‌تواند برای یک دوره خاص بدون نیاز به تأیید مجدد استفاده شود.قرار دادن زمان محدود برای بلیط، احتمال استفاده دوباره توسط شخص دیگر را کاهش می‌دهد. حداکثر زمان عمر می‌تواند به ۰ تنظیم شود، در این صورت بلیط‌های سرویس منقضی نخواهند شد. مایکروسافت حداکثر زمان عمر ۶۰۰ دقیقه را برای بلیط‌های سرویس توصیه می‌کند؛ این مقدار پیش‌فرض در پیاده‌سازی Kerberos در ویندوز سرور است.Kerberos برای چه مواردی استفاده می‌شود؟Kerberos برای احراز هویت اشخاصی که درخواست دسترسی به منابع شبکه را می‌دهند، به ویژه در شبکه‌های بزرگ برای پشتیبانی از SSO استفاده می‌شود. این پروتکل به طور پیش‌فرض در بسیاری از سیستم‌های شبکه‌ای پرکاربرد استفاده می‌شود. برخی از سیستم‌هایی که پشتیبانیKerberos در آن‌ها گنجانده شده یا در دسترس هستند، عبارتند از:Amazon Web ServicesApple macOSGoogle CloudHewlett Packard UnixIBM Advanced Interactive eXecutiveMicrosoft AzureMicrosoft Windows Server and ADOracle SolarisRed Hat LinuxFreeBSDOpenBSDKerberos در مقابل سایر پروتکل‌های احراز هویت شبکهKerberos تنها پروتکل احراز هویت در استفاده عمومی نیست، اما احتمالاً پرکاربردترین آن است. Kerberos به عنوان یک پروتکل امن ثابت شده است که قادر به مقابله با ورودی ناخواسته یا خطاهای در حین اجرا است و در سطح گسترده‌ای پیاده‌سازی شده است.Kerberos در مقابل Microsoft New Technology LAN Manager (NTLM)Microsoft NTLM یک پروتکل احراز هویت قدیمی است که هنوز می‌تواند برای ارائه خدماتSSO در دامنه‌هایAD استفاده شود. این پروتکل در ابتدا در ویندوزNT در سال ۱۹۹۳ در دسترس قرار گرفت؛ مایکروسافت NTLM را برای احراز هویت منسوخ کرد و آن را با Kerberos در ویندوز ۲۰۰۰ جایگزین کرد. در حال حاضر، Kerberos پروتکل احراز هویت اولیه برای ویندوز است.بر خلاف Kerberos، NTLM برای احراز هویت به پروتکل چالش-پاسخ نیاز دارد.Kerberos در مقابل پروتکل دسترسی به فهرست سبک(LDAP)پروتکل LDAP یک روش برای نگهداری و دسترسی به اطلاعات معتبر در مورد حساب های کاربری است. این پروتکل برای اجازه دسترسی کاربر به حساب های خود در خدمات شبکه ای استفاده می شود. LDAP و Kerberos اغلب با هم استفاده می شوند، به طوری که LDAP خدمات اجازه دسترسی را فراهم می کند و Kerberos خدمات احراز هویت را برای شبکه های بزرگ فراهم می کند.Kerberos در مقابل سرویس کاربران از راه دورDial-In (RADIUS)پروتکل RADIUS برای فراهم کردن خدمات احراز هویت برای کاربرانDial-In برای دسترسی به سرویس های اینترنتی یا شبکه های شرکتی از طریق اتصالات مستقیم مانند خطوط تلفنDial-Up طراحی شده است. RADIUS می تواند برای اجازه دسترسی و حسابرسی خدمات شبکه استفاده شود. همچنین می تواند باKerberos یکپارچه شود تا احراز هویت قوی تری فراهم کند.آیا Kerberos امن است؟پروتکل Kerberos به عنوان یک پروتکل امن در نظر گرفته می شود. این پروتکل برای دهه ها پیاده سازی شده است و به عنوان یک مکانیزم رسیدگی شده و امن برای احراز هویت کاربران در نظر گرفته می شود. Kerberos از رمزگذاری قوی، از جمله رمزگذاری کلید مخفی، برای حفاظت از داده های حساس استفاده می کند.پژوهشگران امنیت از زمان انتشار اولیه Kerberos، آن را بررسی کرده اند. ضعف های خاصی در پیاده سازی های خاص Kerberos، و همچنین در خود پروتکل، پیدا شده اند. این ضعف ها رفع شده اند و Kerberosهمچنان برای احراز هویت در اینترنت بنیادی است.بعضی از ضعف های تاریخی Kerberos در شبکه های ویندوز در یک پست وبلاگی در سال 2015 توسط پژوهشگر امنیتی المار نابیگائف خلاصه شد. آنها شامل موارد زیر بودند:· حمله Pass-the-key. این یک نوع حمله Pass-the-hash است که حمله کنندگان با بازیابی مجوزهای کاربران مجاز، به عنوان کاربران مجاز عمل کرده و دسترسی آنها را تقلید می کنند.· حمله Pass-the-ticket. حمله کنندگان به بلیط های ارسالی یا دریافتی کاربران مجاز دسترسی پیدا کرده و آنها را تقلید می کنند و بلیط های خدمات آنها را دوباره استفاده می کنند.· حمله Golden ticket. این یک حمله است که با دسترسی به کنترل کننده دامنه ویندوز، برای ایجاد مجوزهایی که دسترسی نامحدود به خدمات برنامه ای فراهم می کنند، استفاده می شود.برای حفظ امنیت Kerberos، شما باید با آسیب پذیری های امنیتی Kerberos آشنا شوید و با به روز رسانی نرم افزار آشکار سازی یا رفع نقص ها، مانند حمله Kerberoasting در حملات زنجیره تأمین SolarWinds در سال 2020، به روز بمانید.منبع : techtarget.com , Google.com</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 01 May 2023 14:24:02 +0330</pubDate>
            </item>
                    <item>
                <title>سیستم عامل Qubes چیست؟</title>
                <link>https://virgool.io/Rocket/a-simple-introduction-to-qubes-rih7w0t5hrlt</link>
                <description>Qubes OS یک سیستم عامل رایگان و متن باز است که منحصر به فرد برای محافظت از امنیت و حریم خصوصی کاربر طراحی شده است. معماری آن به گونه ای ساخته شده است که کاربر را قادر می سازد تا محیط های امنیتی مختلف (&quot;qubes&quot;) را بر روی کامپیوتر خود تعریف کند و تعامل خود را با یکدیگر و جهان به صورت بصری مدیریت کند. این پروژه قابلیت استفاده سیستم‌عامل Qubes را با این موارد بهبود می‌بخشد: (1) بررسی و ادغام بهبودات قابلیت استفاده از Qubes OS در جامعه، (2) پیاده سازی راهبرد محلی سازی برای سیستم عامل و مستندات آن، و (3) ایجاد رویکرد جامع برای بهبود دسترسی به Qubes OS می باشد.Qubes  چیست؟Qubes یک سیستم عامل (OS) امنیت محور است. سیستم عامل نرم افزاری است که تمامی برنامه های دیگر را روی کامپیوتر اجرا می کند. برخی از نمونه‌های سیستم‌عامل محبوب عبارتند از Microsoft Windows، Mac OS X، Android و iOS. Qubes یک نرم افزار رایگان و منبع باز (FOSS) است. این به این معنی است که همه در استفاده، کپی و تغییر نرم افزار به هر نحوی آزاد هستند. همچنین به این معنی است که کد منبع آشکارا در دسترس است تا دیگران بتوانند در آن مشارکت کرده و آن را بررسی کنند.چرا امنیت سیستم عامل مهم است؟اکثر مردم از سیستم عاملی مانند ویندوز یا OS Xدر رایانه های رومیزی و لپ تاپ خود استفاده می کنند. این سیستم‌عامل‌ها به این دلیل محبوب هستند که استفاده از آنها آسان است و معمولاً روی رایانه‌هایی که مردم می‌خرند از قبل نصب شده‌اند. با این حال، آنها مشکلاتی را در مورد امنیت ایجاد می کنند. برای مثال، ممکن است یک پیوست ایمیل یا وب‌سایت را باز کنید، بدون اینکه متوجه شوید که در واقع به بدافزار (نرم‌افزار مخرب) اجازه می‌دهید روی رایانه شما اجرا شود. بسته به نوع بدافزاری که باشد، ممکن است هر کاری انجام دهد، از نمایش تبلیغات ناخواسته گرفته تا ثبت ضربه‌های کلید یا حتی کنترل کامپیوتر شما. این ممکن است اطلاعات ذخیره شده در کامپیوتر شما را به خطر بیندازد، مانند سوابق پزشکی، ارتباطات محرمانه یا حتی فکرهای نوشته شده در ژورنال خصوصی. بدافزار همچنین می‌تواند در فعالیت‌هایی که با رایانه خود انجام می‌دهید تداخل ایجاد کند. به عنوان مثال، اگر از رایانه خود برای انجام تراکنش های مالی استفاده می کنید، بدافزار ممکن است به سازنده خود اجازه دهد تا تراکنش های جعلی را به نام شما انجام دهد.آیا برنامه های آنتی ویروس و فایروال ها کافی نیستند؟متأسفانه، روش‌های امنیتی سنتی مانند برنامه‌های آنتی ویروس و فایروال های (نرم افزاری و/یا سخت افزاری) دیگر کافی نبوده تا حملات پیچیده را به دور نگه دارد. به عنوان مثال، امروزه معمولا سازندگان بدافزار بررسی می‌کنند که آیا بدافزار آنها توسط برنامه‌های آنتی ویروس معروف شناسایی شده است یا خیر. اگر شناسایی شده باشد ، کد خود را تا زمانی که دیگر توسط برنامه های آنتی ویروس قابل تشخیص نباشد، تغییر میدهند ، سپس آن را ارسال می کنند. بهترین برنامه های آنتی ویروس پس از کشف تهدید جدید توسط برنامه نویسان آنتی ویروس به روز می شوند، اما این معمولاً حداقل چند روز پس از شروع حملات جدید در دنیای واقعی رخ می دهد. تا آن زمان، معمولاً برای کسانی که قبلاً به خطر افتاده اند، خیلی دیر است. علاوه بر این، باگ های نرم‌افزارهای مشترکی که همه ما استفاده می‌کنیم (مانند مرورگر وب) به طور ناگزیر کشف می‌شوند و هیچ برنامه آنتی ویروس یا فایروالی نمی‌تواند جلوي سوء استفاده از همه این باگ ها را بگيرد.چگونه Qubes امنیت را فراهم می کند؟Qubes به شما امکان می دهد بخش های مختلف زندگی دیجیتال خود را به ماشین های مجازی ایزوله شده (VM) جدا کنید. VM یک VM در واقع یک کامپیوتر شبیه سازی شده با سیستم عامل خاص خود است که به عنوان نرم افزار در کامپیوتر فیزیکی شما اجرا می شود. شما می توانید یک VM را به عنوان یک کامپیوتر در داخل چارچوب کامپیوتر خود تصور کنید. این به شما این امکان را می دهد که مثلاً یک ماشین مجازی برای بازدید از وب سایت های غیرقابل اعتماد و یک ماشین مجازی دیگر برای انجام امور بانکی آنلاین داشته باشید. به این ترتیب، اگر VM مرور نامعتبر شما توسط یک وب‌سایت مملو از بدافزار در معرض خطر قرار گیرد، فعالیت‌های بانکی آنلاین شما در خطر نخواهد بود. به طور مشابه، اگر نگران پیوست‌های ایمیل پرخطر هستید، Qubes می‌تواند آن را طوری بسازد که هر پیوست در VM یکبار مصرف و « قابل دور ريزي» خودش باز شود.به طور کلی، Qubes به روش امنيت با جداسازي معروف است که در اینجا به معنای نگه داشتن کارهای شما در کامپیوتر شما درVM های مختلف و جداگانه است تا چارچوب آسيب پذير نشده ديگر را تحت تاثير قرار ندهد. این به شما اجازه میدهد تا همه چیز را در یک کامپیوتر فیزیکی و بدون نگران شدن از حملات سایبر قابل قبول، انجام دادید.Qubes چگونه با استفاده از سیستم عامل &quot; لایو سی دی&quot; مقایسه می شود؟استفاده از لایو سی دی (یا دی وی دی) هنگام انجام فعالیت های حساس، مطمئناً از نظر امنیت برای شما بهتر است تا استفاده از سیستم عامل اصلی خود، اما این روش هنوز بسیاری از خطرات سیستم عامل های معمول را حفظ می کند. برای مثال، سیستم‌عامل‌های زنده محبوب (مانند Tails و سایر توزیع‌های لینوکس) همچنان یکپارچه هستند به این معنا که همه نرم‌افزارها هنوز در همان سیستم‌عامل در حال اجرا هستند. این بدان معناست که اگر جلسه شما به خطر بیفتد، تمام داده ها و فعالیت های انجام شده در همان جلسه نیز به طور بالقوه در معرض خطر قرار می گیرند.چگونه Qubes با اجرای ماشین‌های مجازی در یک سیستم‌عامل معمولی مقایسه می‌شود؟همه نرم‌افزارهای ماشین مجازی در امر امنیت برابر نیستند. شما ممکن است از VMs به عنوان نرم‌افزارهایی مانند VirtualBox یا VMware Workstation استفاده کرده یا درباره آن‌ها شنیده باشید. این ها به عنوان هایپروایزرهای «نوع ۲» یا «میزبانی» شناخته می شوند. (Hypervisor نرم افزار، firmare یا سخت افزاری است که ماشین های مجازی را ایجاد و اجرا می کند.) این برنامه ها محبوب هستند زیرا اساساً به گونه ای طراحی شده اند که استفاده از آنها آسان باشد و تحت سیستم عامل های محبوبی مانند Windows (که سیستم عامل میزبان نامیده می شود، از آنجایی که آنها را اجرا می کنند، طراحی شده اند. VM ها را &quot;میزبان&quot; می کند). با این حال، این واقعیت که هایپروایزرهای نوع ۲ تحت سیستم عامل میزبان اجرا می شوند به این معنی است که آنها واقعاً به اندازه خود سیستم عامل میزبان امن هستند. اگر سیستم عامل میزبان به خطر بیفتد، هر ماشین مجازی که میزبان آن است نیز به طور موثر در معرض خطر قرار می گیرد.در مقابل، Qubes از یک هایپروایزر «نوع ۱» یا « bare metal» به نام Xen استفاده می کند. هایپروایزرهای نوع ۱ به جای اجرا در داخل سیستم عامل، مستقیماً روی سخت افزار اجرا می شوند. این به این معنی است که یک مهاجم باید بتواند هایپروایزر خودش را کنترل کند تا بتواند سیستم کلی را تهدید کند، که بسیار دشوارتر است.Qubes باعث می شود چندین ماشین‌های مجازی که تحت یک هایپروایزر نوع ۱ اجرا می شوند، به طور ایمن به عنوان یک سیستم عامل یکپارچه استفاده شوند. برای مثال، تمام پنجره‌های برنامه شما را با حاشیه‌های رنگی خاصی که سطح اعتماد ماشین‌های مجازی مربوطه را نشان می‌دهد، روی یک دسکتاپ قرار می‌دهد. همچنین مواردی مانند عملیات کپی/پیست امن بین ماشین‌های مجازی، کپی و انتقال امن فایل‌ها بین ماشین‌های مجازی، و شبکه امن بین ماشین‌های مجازی و اینترنت را امکان‌پذیر می‌کند.Qubes چگونه با استفاده از یک دستگاه جداگانه فیزیکی مقایسه می‌شود؟استفاده از یک کامپیوتر جداگانه فیزیکی برای فعالیت‌های حساس مطمئناً از استفاده از یک کامپیوتر با یک سیستم عامل معمولی برای همه چیز، امن‌تر است، اما هنوز هم باید خطرات را در نظر بگیرید. به طور خلاصه، در این روش نسبت به Qubes، مزایا و معایب اصلی آن به شرح زیر است:مزایا:جداسازی فیزیکی بر روی هایپروایزر بنا نمی‌شود. (احتمالاً کمترین احتمال دارد که یک حمله‌کننده از هایپروایزر Qubes خارج شود، اما اگر موفق شود، ممکن است کنترل کل سیستم را به دست آورد.)جداسازی فیزیکی می‌تواند تکمیل طبیعی برای امنیت فیزیکی باشد. (به عنوان مثال، ممکن است قفل کردن لپ تاپ امن خود را در یک صندوق امن در هنگام خروج با لپ تاپ ناموافق از خانه، طبیعی ببینید.)معایب:جداسازی فیزیکی می تواند دست و پا گیر و پرهزینه باشد، زیرا باید برای هر سطح امنیتی که نیاز داریم، یک دستگاه فیزیکی جداگانه را تهیه و راه‌اندازی کنیم.به طور کلی هیچ راه امنی برای انتقال داده بین کامپیوترهای جداگانه فیزیکی با سیستم عامل‌های معمولی وجود ندارد. (Qubes یک سیستم انتقال فایل امن بین VM ها دارد تا با این مسئله برخورد کند.)کامپیوترهای جداگانه فیزیکی با سیستم عامل‌های معمولی هنوز به طور مستقل در برابر اکثر حملامعمولی آسیب‌پذیر هستند به دلیل طبیعت یکپارچه آن‌ها.بدافزاری که می تواند شکاف های هوایی را پر کند چندین سال است که وجود دارد و به طور فزاینده ای رایج می شودجمع بندیدر مورد سیستم عامل Qubes باید به این نکته توجه کرد که این سیستم عامل یک سیستم عامل امنیتی است که برای دستگاه های هوشمند و اینترنت اشیاء طراحی شده است. Qubes OS با استفاده از تکنولوژی مجازی سازی، به کاربران اجازه می دهد تا برای هر فعالیت یک محیط جداگانه و امنیتی را ایجاد کنند.این سیستم عامل بر پایه یونیکس است و از زبان برنامه نویسی C و C ++ استفاده می کند. Qubes OS با استفاده از یک مجموعه کامل از ابزارها و کتابخانه های نرم افزاری، به توسعه دهندگان اجازه می دهد تا برنامه های قابل حمل و قابل توسعه را برای دستگاه های خود بسازند.Qubes OS به دلیل قابلیت های امنیتی خود، به عنوان یکی از بهترین سیستم عامل های امنیتی شناخته می شود. این سیستم عامل از تکنولوژی مجازی سازی استفاده می کند تا به کاربران اجازه دهد تا برای هر فعالیت یک محیط جداگانه و امنیتی ایجاد کنند. به علاوه، Qubes OS با استفاده از معماری مبتنی بر لینوکس، به کاربران اجازه می دهد تا برنامه های قابل توسعه و قابل حمل را برای دستگاه های خود بسازند.به طور خلاصه، Qubes OS یک سیستم عامل امنیتی است که برای دستگاه های هوشمند و اینترنت اشیاء طراحی شده است. این سیستم عامل با استفاده از تکنولوژی مجازی سازی، به کاربران اجازه می دهد تا برای هر فعالیت یک محیط جداگانه و امنیتی را ایجاد کنند. این سیستم عامل بر پایه یونیکس است و از زبان برنامه نویسی C و C ++ استفاده می کند.منبع : nukama.github.io , Google.com</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Sat, 29 Apr 2023 19:45:28 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش صرافی بینگ ایکس BingX + دریافت پاداش 2,400,000 تومانی</title>
                <link>https://virgool.io/Rocket/xnvpm4g8-bingx-exchange-wcobwkygfnta</link>
                <description>? 2,400,000 تومان هدیه دلارو به شما با عضویت در صرافی بینگ ایکس 60$ هدیه بگیرید اگر تاکنون به سراغ ترید ارزهای دیجیتال رفته باشید، با صرافی‌های رمزارزها آشنا هستید. در حال حاضر صرافی‌های ایرانی و خارجی بسیاری در دنیای ارزهای دیجیتال در حال فعالیت هستند اما متاسفانه همه آن‌ها معتبر نیستند. در ادامه این مقاله قصد داریم تا به سراغ یکی از صرافی‌های خارجی معروف برویم که احتمالا نام آن را این روزها زیاد شنیده‌اید.بررسی کلی صرافی بینگ ایکس BingXصرافی بینگ ایکس BingX در سال ۲۰۱۸ ایجاد شده است. تاکنون صرافی بینگ ایکس در کشورهایی از جمله آمریکای شمالی، کانادا، اروپا، هنگ‌کنگ و تایوان نمایندگی‌های فعال دارد. با توجه به این موضوع، شاید پیش خود به این بیاندیشید که بینگ ایکس اجازه ترید و فعالیت به کاربران ایرانی را نمی‌دهد و فقط به کشورهای ذکر شده اجازه معامله را می‌دهد، اما اینگونه نیست! باید بگوییم که صرافی بینگ ایکس به کاربران ایرانی این اجازه را می‌دهد تا به راحتی به فعالیت و استفاده از تمامی قابلیت‌های موجود در این صرافی استفاده کنند. البته باید این نکته را عرض کنیم که وبسایت صرافی بینگ ایکس به تازگی فیلترشده است و برای استفاده از وبسایت این صرافی به نرم افزار‌های تغییر آیپی نیاز است. اما نرم افزار‌های اندروید و ای او اس صرافی بینگ ایکس مشکلی ندارند و بدون نرم افزار‌های تغییر آیپی می‌توانید به راحتی از آن‌ها استفاده کنید.بینگ ایکس به دلیل پیاده سازی قابلیت‌های ویژه در صرافی خود توانسته کاربران بسیار زیادی را جذب خود کند. صرافی بینگ ایکس BingX تا این لحظه بیش از ۵ میلیون کاربر در سرتاسر جهان دارد. همچنین طبق اطلاعات که این صرافی در سایت خود منتشر کرده است، در زمان نگارش این مقاله حجم معاملات ۲۴ ساعته آن در بازار اسپات Spot برابر با بیش از ۵۰۰ میلیون دلار و در بازار پرپچوال Perpetual، بیش از ۱۰ میلیارد دلار است. همچنین لازم به ذکر است که صرافی بینگ ایکس BingX تا به این لحظه از ۳۴۳ رمز ارز پشتیبانی می‌کند.صرافی بینگ ایکس از آن دسته صرافی‌هایی است که از بازارهای تریدینگ متعددی پشتیبانی می‌کند. برخی از بازار‌های این صرافی برای معاملات عبارت‌اند از: همتا به همتا P2P، بازار اسپات و بازار فیوچرز Futures. لازم به ذکر است که صرافی بینگ ایکس در هر کدام از این بازارها امکانات به خصوصی را در اختیار کاربران خود قرار می‌دهد.به طور مثال، ترید در بازار فیوچرز این صرافی در دو حالت پرپچوال و استاندارد است که شما می‌توانید پوزیشن‌های لانگ و یا شورت بر روی کریپتوهای مختلف تا لوریج ۱۵۰ باز کنید و از نوسانات بازار سود بگیرید.همچنین شما می‌توانید به غیر از ترید در بازار رمزارزها، سهام‌های فارکس را نیز در این صرافی معامله کنید. اینطور باید بگوییم که حتی اگر شما در بازار فارکس هم فعالیت می‌کنید می‌توانید از صرافی بینگ ایکس استفاده کنید. این بخش را می‌توانید در قسمت فیوچرز این صرافی ببینید. تفاوتی نمی‌کند که به سراغ بازار پرپچوال برید و یا استاندارد چرا که در هر حالت می‌توانید سهام‌های فارکس را معامله کنید.صرافی بینگ ایکس را می‌توانید در برنامه اندروید Android و ای او اس IOS نیز استفاده کنید. با توجه به این موضوع ممکن است تمایل به استفاده از صرافی فوق در ویندوز داشته باشید و برایتان این پرسش ایجاد شود که آیا می‌توانیم از صرافی بینگ ایکس در سیستم عامل ویندوز و یا سیستم عامل‌های کامپیوتری استفاده کنیم؟ بله، اما برای نسخه‌های کامپیوتری هیچ نرم افزار مخصوصی در حال حاظر موجود نیست. در واقع تعداد کمی از صرافی‌های حال حاضر برای ویندوز نرم افزاری اختصاصی منتشر کرده‌اند، چرا که کاربران صرافی‌ها می‌توانید از طریق سایت و نسخه تحت وب از صرافی مورد نظر خود استفاده کنند.با مواردی که ذکر کردیم حال شما باید تا حدودی با صرافی بینگ ایکس آشنا شده باشید. در ادامه قصد داریم تا بیشتر صرافی فوق را بررسی کنیم و در نهایت به سراغ آموزش نحوه ثبت‌نام در صرافی بینگ ایکس BingX برویم. در صورتی که به دنبال آشنایی بیشتر با این صرافی هستید، با ما همراه باشید.معرفی خدمات و ویژگی‌های صرافی بینگ ایکس BingXصرافی بینگ ایکس خدمات و ویژگی‌های بسیاری را در اختیار کاربرانی که در این صرافی ثبت‌نام کرده‌اند قرار می‌دهد. اگر در بازار رمزارزها کمی حرفه‌ای باشید می‌توانید با مقدار اندکی از سرمایه خود و با استفاده از خدمات ویژه این صرافی به راحتی کسب درآمد کنید. به عنوان مثال قابلیت کپی تریدینگ یکی از ویژگی‌هایی بی نظیری است که می‌توانید بدون هیچ پیچیدگی و با حداقل هزینه برای خود درآمد غیرفعال ایجاد کنید. در ادامه این مقاله به بخش کپی تریدینگ و دیگر بخش‌های موجود بیشتر می‌پردازیم. در کل خدمات صرافی بینگ ایکس عبارت‌اند از:پشتیبانی بینگ ایکس از قابلیت همتا به همتا P2P:همان‌گونه که از نام این بخش پیداست، شما می‌توانید با استفاده از این ویژگی به صورت همتا به همتا تصمیم به خرید ارزهای دیجیتال مختلف با فیات بگیرید. حتی در این بخش صرافی از ریال نیز پشتیبانی می‌شود. یعنی امکان این که بتوان در ازای تومان رمزارز تتر USDT خرید هم وجود دارد.قسمت همتا به همتا در این صرافی شامل دو بخش خرید و فروش است. ولی در حال حاضر فقط قسمت خرید فعال است و شما تنها می‌توانید اقدام به خرید رمزارزها با فیات کنید. باید دوباره متذکر شویم که اگر قصد فعالیت در این بخش را داشته باشید، فقط می‌توانید خرید انجام دهید زیرا بخش فروش هنوز راه اندازی نشده است.طبق اطلاع رسانی صرافی بینگ ایکس این بخش در آینده ارتقا پیدا خواهد کرد و سرویس‌های پرداخت بسیاری به آن اضافه خواهد شد. بنابر توصیه‌های صرافی در هنگام معاملات در این بخش موارد امنیتی را تا جای ممکن رعایت کنید و اگر برایتان پرسشی ایجاد شد، سوال خود را در بخش پشتیبانی صرافی بینگ ایکس که می‌توانید به فارسی آن را مطرح کنید و یا در بخش نظرات این صفحه بپرسید.پشتیبانی بینگ ایکس از بازارهای اسپات و فیوچرز استاندارد و همچنین پرپچوال:می‌توان گفت مهم‌ترین بازار‌های صرافی بینگ ایکس بخش اسپات و فیوچرز است. این صرافی همانند هر صرافی ارزدیجیتال دیگری از بازار فیوچرز و اسپات پشتیبانی می‌کند. صرافی بینگ ایکس در هر دو بازار شرایط، حجم معاملاتی و نقدینگی بسیار مناسبی دارد. اگر تاکنون به سراغ نمودار و یا حجم معاملات صرافی‌های مختلف رفته باشید احتمالا دیده‌اید که این صرافی تقریبا جز ۲۰ صرافی برتر از لحاظ حجم معاملات در جهان است.? 2,400,000 تومان هدیه دلارو به شما با عضویت در صرافی بینگ ایکس 60$ هدیه بگیریدفرقی ندارد که هدفتان فعالیت در بازار اسپات و یا فیوچرز باشد چرا که استفاده از رابط کاربری صرافی بینگ ایکس به قدری راحت است که می‌توانید در آن به راحتی فعالیت کنید.طبق بررسی‌های صورت گرفته در بازار اسپات بیش از ۳۰۰ کوین و توکن مختلف و همچنین بیش از ۷۰ کوین و توکن در بازار پرپچوال موجود است. شما می‌توانید در هنگام معامله در این صرافی با محاسبه خودکار میانگین هزینه و سود و ضرر به راحتی رمز‌ارز‌های مختلف را خرید و فروش کنید.تعداد رمزارزها در بازار فیوچرز نسبت به بازار اسپات بسیار کمتر است اما همان‌طور که می‌دانید در بازار فیوچرز قابلیت‌های بسیار بیشتری وجود دارد. به طور مثال در بازار فیوچرز می‌توانید به راحتی به سراغ اهرم یا لوریج بروید و سود‌های زیادی را از تریدهای خود کسب کنید. البته باید به این نکته توجه داشته باشید که اهرم و لوریج بالا همان‌طور باعث سود کردن می‌شود،‌ می‌تواند ضررهای سنگینی هم به بار بیاورد! به این نکته بسیار دقت کنید.پشتیبانی بینگ ایکس از قابلیت Copy Trading کپی تریدینگ :کپی ترید Copy Trading یکی از جذاب‌ترین قابلیت‌های صرافی بینگ ایکس به شمار می‌آید. اگر تاکنون درباره صرافی بینگ ایکس تحقیق کرده باشید به احتمال زیاد با این قابلیت آشنا هستید. اگر بخواهیم به صورت خلاصه این بخش را بررسی کنیم اینگونه باید بگوییم که شما می‌توانید با استفاده از این ویژگی استراتژی تریدهای دیگران را به راحتی کپی کنید و از آن‌ها سود دریافت نمایید.این ویژگی فارغ از این است که شما با تحلیل و یا طریقه معامله کردن آشنایی دارید یا خیر اتفاق ‌می‌افتد. یعنی اگر از علم معامله گری و تحلیل ترید هم چیزی ندانید نیز می‌توانید با استفاده از کپی تریدینگ از معامله چه در بازار رمزارزها و چه در بازار فارکس سود دریافت کنید.به غیر از صرافی بینگ ایکس، اگر در صرافی معروف بایننس حساب وریفای شده داشته باشید، می‌توانید به واسطه صرافی بینگ ایکس در صرافی بایننس نیز معاملات کپی تریدینگ انجام دهید. فرآیند انجام این کار به طور خلاصه به این شکل است که شما API صرافی بایننس را در حساب صرافی بینگ ایکس خود وارد می‌کنید در این صورت اگر در بخش فیوچرز صرافی بایننس پوزیشنی باز کنید به صورت خودکار معامله شما در صرافی بینگ ایکس برای کاربرانی که شما را فالو و انتخاب کرده‌اند کپی می‌شود.مراحل انتخاب معاملگر و شرکت در کپی ترید صرافی بینگ ایکس بسیار آسان است. شما می‌توانید به راحتی با توجه به مشخصات هر تریدر، بهترین معاملگر را بررسی و انتخاب کنید و سپس معاملات تریدر مورد نظر خود را کپی و در نهایت سود کنید البته این نکته را هم در نظر بگیرید اگه تریدر مورد نظر در معاملات خود دچار ضرر شود شما هم دچار ضرر خواهید شد.پشتیبانی بینگ ایکس از قابلیت Grid Trading گرید تریدینگ :قابلیت و ویژگی گرید تریدینگ Grid Trading معمولا در صرافی‌های رمزارزها پیاده سازی نمی‌شود و برخی از شرکت ها آن‌ها را به صورت یک پلتفرم جداگانه توسعه ‌می‌دهند. اما صرافی بینگ ایکس برعکس تمام صرافی‌های ارزدیجیتال موجود، این قابلیت را در صرافی خود توسعه و ایجاد کرده است. این ویژگی به نوعی یکی از بهترین و مثبت‌ترین فعالیت‌های بینگ ایکس به شمار می‌آید به این خاطر که شما می‌توانید تنها با یک بار ثبت‌نام و احراز هویت به راحتی هم معامله کنید و هم از این قابلیت بهره‌مند شوید.با بررسی مطالب بالا شاید برایتان این پرسش پیش بیاید که قابلیت گرید تریدینگ دقیقا چیست و چه کاری می‌توانیم با آن انجام دهیم؟ با کمک بخش گرید تریدینگ در صرافی بینگ ایکس شما می‌توانید با یک استراتژی در بازار رمزارزها شروع به معامله کنید. این بخش از صرافی به ۳ دسته معامله در بازار فیوچرز و معامله در بازار اسپات و معامله در بازار گرید بی نهایت یا Infinity صورت می‌پذیرد.? 2,400,000 تومان هدیه دلارو به شما با عضویت در صرافی بینگ ایکس 60$ هدیه بگیریدشیوه و روش این قسمت به این صورت است که شما دو محدوده‌ی مورد نظر خود را وارد می‌کنید. سپس طبق محدوده‌ها و تنظیماتی که وارد کرده‌اید صرافی به صورت خودکار در کف قیمت خرید انجام می‌دهد و سپس در سقف قیمت رمزارز مورد نظر را‌ می‌فروشد. شما می‌توانید این فرآیند را در بازار اسپات نیز انجام دهید. البته این نکته را هم در نظر بگیرید که در بخش فیوچرز نیز می‌توانید به همین شکل ترید انجام دهید با این تفاوت که در فیوچرز می‌توانید اهرم یا لوریج نیز مشخص کنید. با استفاده و تعیین اهرم برای پوزیشن‌های خود سود و ضرر شما نیز افزایش پیدا می‌کند.در بخش گرید بی نهایت یا همان Infinity که حالت پیشرفته گرید تریدینگ است، در این بخش دیگر شما هیچ سقفی برای صرافی تعیین نمی‌کنید و تنها باید یک کف انتخاب کنید. سپس صرافی طبق محدوده و تنظیماتی که برای پوزیشن خود مشخص کرده‌اید خرید را برای شما انجام می‌دهد و سپس از همان جایی که خودش تشخیص دهد که بازار در حال برگشت است رمزارز شما را‌ می‌فروشد. به همین آسانی می‌توانید تنها با مشخص کردن دو سطح به راحتی خرید و فروش رمزارزها را انجام دهید و به کسب سود از این بازار بپردازید.آموزش ثبت‌نام و فعالیت در صرافی بینگ ایکس BingXاگر به خوبی مطالب بالا رو مطالعه کرده باشید، باید با صرافی ارزدیجیتال و بازار مشتقات بینگ ایکس به طور کامل آشنا شده باشید. در ادامه این مطلب قصد داریم به سراغ آموزش ثبت‌نام و فعالیت در صرافی بینگ ایکس برویم. اگر در هنگام ثبت‌نام در این صرافی با مشکل رو به رو شده‌اید، مطالعه این بخش را از دست ندهید.برای ثبت‌نام ابتدا باید وارد سایت صرافی بینگ ایکس BingX شوید. به محض ورود با صفحه‌ای همچون تصویر زیر رو به رو خواهید شد. همان‌گونه که در تصویر زیر برای شما مشخص کرده‌ایم، برای ثبت‌نام لازم است تا گزینه Register را انتخاب کنید. در صورتی که از قبل در این صرافی اقدام به ساخت حساب کرده‌اید، از قسمت Login می‌توانید وارد حساب کاربری خود شوید.اگر گزینه Register را انتخاب کنید با صفحه دیگری رو به رو ‌می‌شوید. شما می‌توانید صفحه فوق را در تصویر زیر مشاهده کنید. همان‌طور که میبینید شماره گذاری‌هایی در تصویر مشخص شده است، در ادامه هر بخش را به صورت مجزا توضیح‌ می‌دهیم پس با ما همراه باشید.1. در این بخش شما می‌توانید برای ثبت‌نام از ایمیل و یا شماره تلفن همراه استفاده کنید. اینکه کدام یک را انتخاب کنید که این امر بستگی به خودتان دارد اما ترجیح این است که ابتدا به سراغ ایمیل بروید و با ایمیل ثبت‌نام خود را انجام دهید. بنابراین، در این بخش بر روی تب ایمیل کلیک کنید. در صورتی که تب فوق در حالت انتخاب بود، آن را تغییر نداده و ادامه مراحل را دنبال کنید.2. در این قسمت همان‌طور که مشخص است باید ایمیل خود را وارد کنید. ایمیل شما‌ می‌بایست معتبر باشد چرا که در مرحله بعد برای ایمیل شما کد ارسال می‌شود. در صورتی که ایمیل وارد شده معتبر نباشد نمی‌توانید کد تایید ایمیل را دریافت کنید. در نتیجه حتما در این بخش از یک ایمیل معتبر استفاده کنید. (پیشنهاد ما به شما این است که یک ایمیل جداگانه برای صرافی‌های رمزارز خود ایجاد کنید.)3. در این بخش باید برای حساب کاربری خود یک پسورد یا گذرواژه انتخاب نمایید. گذرواژه انتخابی همان رمز عبور حساب کاربری شما است. یعنی اگر فردی به رمز فوق دسترسی داشته باشد ‌می‌تواند به راحتی وارد حساب صرافی شما شود. در نتیجه باید یک رمز عبور قدرتمند و غیرقابل حدس انتخاب کنید. برای انتخاب رمز عبور بهتر است به نکاتی که در ادامه اشاره ‌می‌کنیم دقت کنید.پسورد شما نباید تنها از اعداد و یا حروف انتخاب شود. یک پسورد قدرتمند شامل اعداد، حروف و کاراکتر است. همچنین بهتر است رمز عبوری که انتخاب می‌کنید از تعداد کلمات زیادی تشکیل شده باشد. نمونه‌ای از رمز عبور‌های قدرتمند عبارت‌اند از:  g*8HeP#O$zQo:|j وv+Rt#2Kcag!3tYMA4. اگر کد دعوت دارید، در بخش Referral Code باید کد دعوت خود را وارد کنید. با داشتن کد دعوت شما می‌توانید در کارمزد معاملات صرافی بینگ ایکس BingX تخفیف دریافت کنید. در صورت تمایل می‌توانید از کد دعوت XNVPM4G8 استفاده نمایید و از آن طریق ثبت‌نام خود را انجام دهید. کد دعوت XNVPM4G8 شامل ۲۵٪ کارمزد معاملات است.5. در بخش صرافی بینگ ایکس از شما می‌خواهد مشتری شرایط موجود را موافقت کرده و قوانین آن را به رسمیت بشناسد و برای اینکار باید تیک مشخص شده را فعال کنید.6. در پایان پس از کامل کردن تمام فیلد‌های فوق، برای انجام مراحل ثبت‌نام باید بر روی گزینه Next کلیک کنید. به محض کلیک بر روی این گزینه با صفحه دیگری رو به رو‌ می‌شوید که در ادامه می‌توانید نمایی از صفحه فوق را مشاهده کنید.7. اگر از قبل حساب کاربری در صرافی بینگ ایکس داشته باشید، می‌توانید از این بخش و با انتخاب گزینه Login برای ورود به حساب کاربری خود اقدام نمایید.اگر گزینه Login را انتخاب کنید همان‌گونه که اشاره کردیم با صفحه‌ای همچون تصویر زیر مواجه‌ می‌شوید. در این بخش همان‌طور که مشخص است به حساب ایمیل شما یک کد ارسال می‌شود. شما باید به ایمیل مورد نظر خود مراجعه کرده و کد دریافتی را در فیلد مشخص شده وارد کنید. به محض تکمیل فیلد مشخص شده، باید برای ثبت‌نام بر روی گزینه Register کلیک کنید، در این صورت ثبت‌نام شما به همین راحتی انجام می‌گیرد.اگر در بخش قبل کد ارسالی را به درستی وارد کرده باشید، به محض انتخاب گزینه Register با صفحه‌ای همچون تصویر زیر رو به رو خواهید شد. این بخش صفحه اصلی صرافی بینگ ایکس BingX است.تا به این بخش از مقاله آموزش ثبت‌نام به صورت کامل برای شما ارائه شده است. در ادامه قصد داریم تا به شما کمک کنیم تا بتوانید امنیت حساب کاربری خود را هرچه بیشتر افرایش دهید. برای انجام دادن این عمل لازم است تا تایید هویت دو عاملی حساب خود را فعال کنید. برای انجام این کار شما می‌توانید از شماره همراه، فعالسازی رمز عبور دارایی و یا از اپلیکیشن Google Verification  که آموزش آن را در پایین این نوشته مشاهده می‌کنید استفاده کنید.? 2,400,000 تومان هدیه دلارو به شما با عضویت در صرافی بینگ ایکس 60$ هدیه بگیریددر این بخش قصد داریم تا به شما آموزش دهیم که چگونه می‌توانید نرم افزار Google Verification را در اکانت خود فعال کنید تا امنیت حساب شما چند پله افزایش پیدا کند. برای انجام این کار ابتدا همانند تصویر زیر بر روی گزینه مشخص شده کلیک کرده و سپس گزینه Account &amp; Security را انتخاب کنید.برای دسترسی به بخش Security Center ، لازم است تا صفحه را به سمت پایین اسکرول کنید تا به بخشSecurity Center برسید. در این قسمت، بخش‌های مختلفی مثل ایمیل، یا Google Verification وجود دارند. در این بخش ما از تمام موارد می‌گذریم و مستقیم به سراغ فعالسازی Google Verification‌ می‌رویم. برای شروع باید بر روی گزینه Link کلیک کنید.در این صورت با صفحه ی دیگری همچون تصویر زیر رو به رو خواهید شد. همان‌طور که در ابتدای تصویر مشاهده می‌کنید این بخش شامل ۳ مرحله است. مرحله اول مربوط به دانلود نرم افزار Google Authenticator است. در صورتی که کاربر سیستم عامل آیفون یا IOS هستید با اسکن اولین QR Code خواهید توانست نرم افزار را به صورت مستقیم دانلود کنید. در صورتی که کاربر سیستم عامل اندروید Android هستید می‌توانید کد QR مختص به اندروید را اسکن کنید. پس از دانلود و نصب نرم افزار Google Authenticator باید بر روی گزینه Next کلیک کنید.در این صفحه شما به بخش دوم که مربوط به فعالسازی Google Authenticator است منتقل خواهید شد. در این بخش یک QR Code به همراه یک عبارت برایتان نمایش داده شده است. شما نیز باید از طریق عبارت فوق و یا QR Code مربوطه این قابلیت را فعال کنید. به محض وارد کردن عبارت و یا اسکن کد فوق مشاهده خواهید نمود که قابلیت Google Verification برای شما فعال شده است. برای ادامه باید بر روی گزینه Next کلیک کنید.در این صفحه، برای اینکه حساب شما تایید نهایی شود، باید دو عبارت تایید را در قسمت‌های مشخص شده وارد کنید. در قسمت Email Verification Code باید کدی که به ایمیل شما ارسال می‌شود را وارد کنید. برای ارسال کد ابتدا باید بر روی گزینه Send کلیک کنید. پس از وارد نمودن کدی که به ایمیلتان ارسال شده است، نوبت به کدی که در نرم افزار Google Authenticator به شما نمایش داده می‌شود، رسیده است. کد فوق را باید در بخش دوم یا Google Verification Code وارد نمایید. در نهایت پس از تایید هر دو کد باید گزینه تایید یا Submit را انتخاب نمایید. در صورتی که کد‌های وارد شده مورد تایید باشد، قابلیت Google Verification برای شما فعالسازی خواهد شد.جمع بندیدر این آموزش قصد داشتیم تا به شما ثبت‌نام در صرافی بینگ ایکس را آموزش دهیم. اکنون با نحوه ثبت‌نام و همچنین ایمن سازی حساب کاربری خود در صرافی بینگ ایکس BingX کاملا آشنا شدید. ممنون که تا پایان این مقاله آموزشی همراه ما بودید.</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 17 Apr 2023 20:58:26 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی تابع fetch در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/fetch-okascua3yf11</link>
                <description>سلام دوستان جاوااسکریپتی! اگه تا الان با پلاگین‌ها و کتابخونه‌های خارجی مثلا جی‌کوئری و Axios برای ارسال درخواست ای‌جکس (Ajax) کار می‌کردیم، خوبه که بدونیم جاوااسکریپت برای این کار یک تابع درونی به اسم fetch اضافه کرده که علاوه بر قدرتمند بودن، کار با اون خیلی راحت و ساده هست. امروز این تابع رو بررسی می‌کنیم.نکته: برای درک بهتر این تابع، باید با پرامیس‌های جاوااسکریپت آشنایی داشته باشین. همچنین توی این پست برای سادگی و خوانایی بهتر از async/await استفاده شده. اگه با این موضوع‌ها آشنایی ندارین می‌تونین پست‌های زیر رو بخونین:آموزش Promise در جاوا اسکریپت به زبان سادهآموزش async و await در جاوااسکریپت به زبان سادهتابع fetchکار با این تابع به سادگی کد زیر هست:fetch(url);تموم! این تابع بعد از اجرا شدن، یک پرامیس به ما برمی‌گردونه. این پرامیس شامل یک سری اطلاعات از نتیجه درخواست هست. برای اینکه به این اطلاعات دسترسی داشته باشیم باید پرامیس رو باز کنیم. ابتدا کارمون رو با مثال زیر شروع کنیم:async function users() {
  let response = await fetch(&#039;https://randomuser.me/api/?results=10&#039;);
  
  console.log(response);
};

users();خروجی خط ۴ بصورت زیر هست:همونطور که می‌بینیم خروجی یک نمونه از کلاس داخلی Response که شامل اطلاعاتی مثل status و headers و body هست. چیزی که توی body قرار گرفته، شامل پاسخ اصلی هست که از سمت سرور اومده. توی این مرحله باید مشخص کنیم پاسخی که از سرور اومده رو به چه فرمتی می‌خوایم؛ متنی؟ جی‌سان؟ ?توی شرایط مختلف می‌تونیم از فرمت‌های زیر استفاده کنیم:response.text();
response.json();
response.formData();
response.blob();
response.arrayBuffer();خروجی همه‌ی فرمت‌های بالا یک پرامیس هست. پس برای دسترسی به خروجی اصلی باید یه بار دیگه پرامیس رو پردازش کنیم.توی مثالمون می‌خوایم خروجی جی‌سان باشه. پس از خط ۲ کد بالا استفاده می‌کنیم. کد رو بصورت زیر تکمیل کنیم:async function users() {
  let response = await fetch(&#039;https://randomuser.me/api/?results=10&#039;);
  let data = await response.json();

  return data;
};

users().then(data =&gt; console.log(data));به همین سادگی. خط ۸ کد بالا شامل پاسخی هست که از سرور اومده و به صورت جی‌سان خواهد بود.در حالت پیشفرض درخواست‌ها با متد GET فرستاده میشن. برای مشخص کردن متد و یا تنظیم کردن هدر باید درخواستمون رو شخصی‌سازی کنیم.شخصی‌سازی درخواستتوی پارامتر دوم تابع fetch می‌تونیم نوع متد رو مشخص کنیم، data پاس بدیم و هدر ست کنیم:const request = fetch(url, {
  method: &#039;POST&#039;,
  headers: {
    Accept: &#039;application/json&#039;,
    Authorization: &#039;Bearer ...&#039;
  },
  body: JSON.stringify({ name: &#039;Warner&#039; })
});


request
.then(response =&gt; response.json())
.then(result =&gt; {
  console.log(result);
});توی مثال بالا متد رو method مشخص کردیم. برای ارسال هدر درخواست از headers استفاده کردیم و برای ارسال اطلاعات به سرور از body. نوع body ‌‌می‌تونه رشته‌‌ای یا Blob باشه. و یا FormData مثل کد زیر:let formData = new FormData();
formData.append(&#039;name&#039;, &#039;Duck&#039;);
formData.append(&#039;lastname&#039;, &#039;Ducky&#039;);

let request = fetch(url, {
  method: &#039;POST&#039;,
  body: formData
});مدیریت خطاهاخب می‌دونیم که همیشه درخواست‌ها موفقیت آمیز نیستن و ممکنه خطاهایی مثل ۴۰۴، ۴۰۱ پیش بیاد و یا کلا سرور یا اینترنت در دسترس نباشن. اگه درخواستی موفقیت آمیز نباشه، خروجی تابع fetch بصورت زیر هست:همونطور که می‌بینیم status داره کد ۴۰۴ رو نشون میده و مقدار ok برابر با false هست. برای اینکه بتونیم این خطا رو مدیریت کنیم، کد رو به صورت زیر می‌نویسیم:async function users() {
  try {
    let response = await fetch(&#039;https://randomuser.me/apis/?results=10&#039;);
  
    if (response.ok) {
      let data = await response.json();
      return data;
    }
  } catch(e) {
    // Handle the unexpected error
  }
};

users().then(data =&gt; {
  if (typeof data == &#039;object&#039;) {
    // ...
  }
});توی این مثال و توی خط ۵ از response.ok استفاده کردیم که مقدار اون اگه نتیجه درخواست موفقیت آمیز باشه true هست. همچنین از try/catch استفاده کردیم که اگه با خروجی غیرمنتظره‌ای (مثل CORS) مواجه شدیم بتونیم اون رو مدیریت کنیم.نتیجه گیریهمونطور که می‌بینیم تابع fetch برای استفاده‌های ساده، خیلی مفید و راحت هست که وقتی با async/await مخلوط میشه جذاب‌تر هم میشه. اما انعطاف پذیری‌هایی که توی پلاگین‌های بیرونی وجود داره رو هنوز توی این تابع نمی‌بینیم. مثل مشخص کردن یک هدر پیشفرض که توی همه‌ی درخواست‌ها ست شده باشه و یا مدیریت راحت‌تر خطاها. همچنین این تابع فقط توی محیط مرورگرهای مدرن قابل استفاده هست. (وضعیت پشتیبانی مرورگرها از این تابع رو ببینید).البته برای همه‌ی این کاستی‌ها راه حل هم وجود داره. برای استفاده از این تابع توی مرورگرهای قدیمی میشه از پلاگین‌هایی استفاده کنیم که این تابع رو Polyfill کردن. همچنین پلاگین‌هایی مثل zlFetch وجود داره که زیر پوست از fetch استفاده می‌کنه که با اون میشه خروجی (موفقیت‌آمیز بودن یا خطا) رو بهتر مدیریت کرد.خب این مقاله هم به پایان رسید. روزتون خوش ? ?منابعی که برای این پست استفاده کردم:https://javascript.info/fetchhttps://medium.com/javascrip...https://css-tricks.com/using-fetch/https://ditty.ir/</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 24 Oct 2022 22:51:40 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی JSON در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/json-in-js-eugusn68n36v</link>
                <description>درود دوستان! خیلی وقت‌ها اطلاعاتی توی برنامه داریم که می‌خوایم توی برنامه‌های دیگه در دسترس باشه. مثلاً آبجکت user رو در نظر بگیرید که شامل اطلاعاتی از کاربر هست:const user = {
  name: &#039;Emily&#039;,
  age: 4,
  favorites: [&#039;Reading&#039;, &#039;Walking&#039;],
};حالا می‌خوایم این اطلاعات رو به یک برنامه دیگه (مثلاً برنامه سمتِ سرور که با PHP نوشته شده) ارسال و اونجا اون رو بررسی کنیم. اما فرمت و نحوه نوشتن این آبجکت برای بقیه زبان‌ها ناشناخته هست. برای مثال چنین آبجکتی توی PHP تقریباً به این صورت نوشته میشه:$user = [
  &amp;quotname&amp;quot =&gt; &amp;quotEmily&amp;quot,
  &amp;quotage&amp;quot =&gt; 4,
  &amp;quotfavorites&amp;quot =&gt; [&amp;quotReading&amp;quot, &amp;quotWalking&amp;quot],
];خب ما چطوری می‌تونیم اطلاعاتی داشته باشیم که توی همه زبان‌ها خوانا باشه؟ باید یک فرمت استاندارد وجود داشته باشه که برای همه زبان‌ها شناخته شده و خوانا باشه. جواب، فرمت JSON هست ?توی این قسمت می‌خوایم یاد بگیریم که:جی‌سان (JSON) چیه؟جی‌سان چه شکلیه؟چطوری اطلاعات رو به جی‌سان تبدیل کنیم؟چه نوع‌های داده‌ای رو میشه به جی‌سان تبدیل کنیم؟چطوری رشتهٔ جی‌سان رو تفسیر کنیم؟آبجکت‌ها و تبدیل به جی‌سان به‌صورت دلخواهجی‌سان (JSON) چیه؟ ?JSON (جی‌سان) یک فرمت استاندارد برای تبادل اطلاعات هست. هر چند این تبادل اطلاعات معمولاً از یک زبان به یک زبان دیگه هست، فرمت جی‌سان طوری هست که برای انسان هم خوانا باشه.JSON مخفف JavaScript Object Notation هست. این فرمت به صورت یک رشتهٔ متنی هست که از ساختار جاوااسکریپت به ارث برده شده و به همین دلیل ساختار اون شباهت زیادی به آبجکت‌های جاوااسکریپتی داره. اما در حال حاضر کاملاً مستقل از جاوااسکریپت هست و تقریباً همه زبان‌های برنامه‌نویسی توانایی کار با فرمت جی‌سان رو دارن. جی‌سان به دلیل حالت رشته‌ای بودنش تقریباً قابل انتقال به هر زبانی هست.جی‌سان چه شکلیه؟رشتهٔ زیر یک رشتهٔ جی‌سان هست:{&amp;quotname&amp;quot:&amp;quotEmily&amp;quot}همونطور که احتمالاً تشخیص دادین، این حالت رشته‌ای یک آبجکت هست که یک پراپرتی به اسم name داره با مقدار Emily. اما خب توی یک برنامه معمولاً با رشته‌های جی‌سان پیچیده‌تری سر و کار داریم.چطوری اطلاعات رو به جی‌سان تبدیل کنیم؟هر زبانی روش خاص خودش رو برای کار با رشته‌های جی‌سان داره. توی جاوااسکریپت ما یک آبجکت سراسری داریم به اسم JSON. این آبجکت که همه جای برنامه در دسترس هست، یک متد داره به اسم stringify که با اون می‌تونیم اطلاعاتمون رو به جی‌سان تبدیل کنیم.توی کد زیر می‌خوایم آبجکت user رو به رشتهٔ جی‌سان تبدیل کنیم:const user = {
  name: &#039;Emily&#039;,
  age: 4,
  favorites: [&#039;Reading&#039;, &#039;Walking&#039;],
};

const formattedUser = JSON.stringify(user);

alert(formattedUser);
// {&amp;quotname&amp;quot:&amp;quotEmily&amp;quot,&amp;quotage&amp;quot:4,&amp;quotfavorites&amp;quot:[&amp;quotReading&amp;quot,&amp;quotWalking&amp;quot]}الان آبجکت user تونست به فرمتی تبدیل بشه که قابل تبادل با بقیه زبان‌ها و برنامه‌ها باشه. بقیه زبان‌ها راحت می‌تونن اون رو تفسیر و بررسی کنن.ورودی متد stringify باید یک نوع داده‌ای معتبر جاوااسکریپتی باشه. وقتی اطلاعاتی رو به حالت جی‌سان تبدیل می‌کنیم، به اصطلاح می‌گیم اطلاعات رو سریالایز (Serialize) کردیم. رشته‌های جی‌سان معمولاً توسط برنامه تولید میشه. یعنی خیلی کم اتفاق میوفته که یک برنامه‌نویس بخواد به صورت دستی یک رشتهٔ جی‌سان بنویسه.چه نوع‌های داده‌ای رو میشه به جی‌سان تبدیل کنیم؟همونطور که می‌دونیم توی جاوااسکریپت نوع‌های داده‌ای مختلفی داریم. بعضی از این نوع‌ها به شکل‌های مختلفی توی رشته‌های جی‌سان قرار می‌گیرن و بعضی‌ها کلاً قابلیت قرار گرفتن توی رشته‌های جی‌سان رو ندارن.نوع‌های داده‌ای بولین، عدد، رشته، نال و آبجکت می‌تونن توی یک رشتهٔ جی‌سان قرار بگیرن. یعنی برای مثال اگه آرایه‌ای داشته باشیم که شامل چنین نوع‌های داده‌ای باشه، با تبدیل آرایه به جی‌سان، همگی رو می‌تونیم توی خروجی ببینیم:const types = [
  &amp;quothello&amp;quot,            // string
  29,                 // number
  false,              // boolean
  { name: &amp;quotEmily&amp;quot },  // object
  null,               // null
];

const serialized = JSON.stringify(types);

alert(serialized); // [&amp;quotstring&amp;quot,29,false,{&amp;quotname&amp;quot:&amp;quotEmily&amp;quot},null]اما بعضی از نوع‌های داده‌ای مثل undefined و توابع قابلیت قرار گرفتن توی رشته‌های جی‌سان رو ندارن. بر این اساس وقتی یک آبجکت رو به جی‌سان تبدیل می‌کنیم متدهای اون و همچنین پراپرتی‌هایی که مقدار اونها undefined هست نادیده گرفته میشن. همچنین مقدار پراپرتی که NaN باشه null در نظر گرفته میشه:const user = {
  name: &amp;quotMario&amp;quot,
  favorites: undefined,
  age: NaN,
  talk() {

  }
}

const serialized = JSON.stringify(user);

alert(serialized); // {&amp;quotname&amp;quot:&amp;quotMario&amp;quot,&amp;quotage&amp;quot:null}اگه چنین نوع‌های داده‌ای توی یک آرایه قرار بگیرن تبدیل به null میشن:const array = [&amp;quotstring&amp;quot, () =&gt; {}, undefined, NaN];

alert(JSON.stringify(array)); // [&amp;quotstring&amp;quot,null,null,null]چطوری رشتهٔ جی‌سان رو تفسیر کنیم؟فرض کنیم اطلاعاتی به صورت یک رشتهٔ جی‌سان به سمت برنامه اومده:const input = &#039;{&amp;quotname&amp;quot:&amp;quotEmily&amp;quot,&amp;quotage&amp;quot:4,&amp;quotfavorites&amp;quot:[&amp;quotReading&amp;quot,&amp;quotWalking&amp;quot]}&#039;;الان مقدار متغیر input یک رشتهٔ جی‌سان هست. برای اینکه بتونیم با اون کار کنیم ابتدا باید اون رو تفسیر کنیم. ما این کار رو با متد parse از آبجکت JSON انجام می‌دیم:const input = &#039;{&amp;quotname&amp;quot:&amp;quotEmily&amp;quot,&amp;quotage&amp;quot:4,&amp;quotfavorites&amp;quot:[&amp;quotReading&amp;quot, &amp;quotWalking&amp;quot]}&#039;;

const user = JSON.parse(input);

console.log(user);
alert(user.name);      // Emily
alert(user.favorites); // Reading, Walkingبا اجرای کد می‌بینیم که یک آبجکت معتبر جاوااسکریپتی به ما نمایش داده میشه. وقتی یک رشته جی‌سان رو به نوع قابل فهم برای جاوااسکریپت تبدیل کردیم، به اصطلاح می‌گیم رشته رو آنــــسِریالایز (Unserialize) کردیم.ورودی متد parse باید یک رشتهٔ معتبر جی‌سان باشه. در غیر این صورت خطا می‌گیریم.توی کد زیر بعضی از کارکترهای رشتهٔ جی‌سان به عمد حذف شده:const input = &#039;{&amp;quotname&amp;quot:&amp;quotEmily&amp;quot,&amp;quotage&amp;quot:4,&amp;quotfavorites&amp;quot:[&amp;quotReading]&#039;;

JSON.parse(input); // SyntaxError: JSON.parse:
                   // unterminated string at line 1 column 47
                   // of the JSON dataبا اجرای کد می‌بینیم که جاوااسکریپت با خطا میگه نمی‌تونم این رشته رو تفسیر کنم.آبجکت‌ها و تبدیل به جی‌سان به‌صورت دلخواهاگه می‌خوایم به صورت شخصی‌سازی شده یک آبجکت رو تبدیل به جی‌سان کنیم، مثلاً توی آبجکت پراپرتی‌هایی داریم که نمی‌خوایم توی حالت جی‌سان حضور داشته باشن، باید توی آبجکت یک متد تعریف کنیم به اسم toJSON. این متد مسئول فراهم آوردن چیزهایی هست که می‌خوایم توی جی‌سان وجود داشته باشه:const user = {
  name: &amp;quotMario&amp;quot,
  password: &amp;quotxx-cat-xx&amp;quot,
  
  toJSON(){
    const _this = this;

    return {
      name: _this.name,
      age: 4,
    }
  }
}

const serialized = JSON.stringify(user);

alert(serialized); // {&amp;quotname&amp;quot:&amp;quotMario&amp;quot,&amp;quotage&amp;quot:4}در واقع هر چیزی که توسط متد toJSON ریترن (Return) بشه توی خروجی قرار می‌گیره. ما توی این متد یک آبجکت دلخواه دیگه رو ریترن کردیم.خب دوستان این همه چیزهایی بود که باید از جی‌سان می‌دونستیم. توی یک برنامهٔ جاوااسکریپتی خیلی زیاد با جی‌سان سر و کار داریم. روزتون خوش. تا قسمت بعدی ?✌️Resources:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringifyhttps://www.json.org/json-en.htmlhttps://ditty.ir/</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 24 Oct 2022 21:58:44 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی در حوزه بلاک‌چین (پرسش و پاسخ)</title>
                <link>https://virgool.io/Solidity/programming-in-the-field-of-blockchain-questions-and-answers-tcqart9t4uyi</link>
                <description>این پست بنظرم می‌تونه به خیلی از افرادی که می‌خوان برنامه نویسی تو حوزه بلاک‌چین رو یادبگیرند کمک کننده باشه، برای همین شبکه‌های اجتماعی و کامیونیتی‌های زیادی چه فارسی و چه انگلیسی زبان رو بررسی کردم تا بتونم همچین پستی رو بنویسم. ممنون میشم با لایک و کامنت از این پست حمایت کنید??.پرسش: برای کسی که فرانت رو تا حدی مسلط شده و میخواد اسمارت‌کانترکت دولوپر بشه ، کدوم مسیر مناسب تره؟ بره اول بک‌اند رو یادبگیره و بعد بره سمت سالیدیتی و اسمارت کانترکت ها یا یادگیری بک‌اند الزامی نیست و میتونه مستقیم بره و سالیدیتی یادبگیره؟پاسخ اول: در حال حاضر دولوپرهای بلاکچین دو دسته کلی هستند1: Blockchain Core Dev2: Blockchain App Devاولین دسته نیاز به بک-اند قوی دارند و البته این دسته بخش کوچک از دنیای بلاکچین هستند، جاب افر های کمتری هم دارند. کارشون اینه که روی هسته مرکزی بلاکچین ها کار میکنند.اما دسته دوم خیلی گسترده است. وقتی شما یک اپلیکیشن روی بلاکچین های مهم مثل اتریوم میسازید که همون DApp ها میشند زیرشاخه های مختلفی از دولوپرهای بلاکچین و وب رو شامل میشه. و تقاضای کار بالایی هم داره.در واقع قراردادهای هوشمند مستقیما با فرانت اند سروکار دارند. اموزش سالیدیتی، openZeppelin که کتابخانه مرجع برای قراردادهای هوشمند هست خیلی کمک میکنه. بچه های جاوااسکریپت هم موقعیت شغلی خوبی میتونند پیدا کنند. Web3.js هم حتما لازم میشه و ...پاسخ دوم: اول بکند بعد اسمارت کانتراکت ... سالیدیتی زیاد سخت نیست و شاید کمتر برای پروژه به کار بیاد ولی اگه بکند بلد باشی راحت تر و کم هزینه تر و کلین کد تر میتونی با سالیدیتی کار کنی چون هر کد نویسی بیشتر باعث افزایش گس فی توی شبکه میشه این نکته خیلی مهمه. پس چی شد؟ اول بک-اند، دوم سالیدیتی، سوم web3.پاسخ سوم: (تو این پاسخ دیدگاه های جذابی رو مشاهده کردم)شخص A: بک-اند رو بالاخره باید یاد بگیری. چه قبل از یادگیری سالیدیتی چه بعد از اون. برای توسعه‌ی Dapp، شما باید در آخر از قرارداد هوشمند داده بگیری و به اون داده بدی. این کار با ماژول‌هایی انجام میشه که سمت بک‌اند عه.شخص B: جناب قراردادی که مینویسی خودش حکم سروره شماست ، نیازی ب بک اند نداری باید با کتاب خونه ی وب ۳ از طریق ری اکت یا ویو ارتباط بگیری با قراردادتپس مهمه تمرکز رو روی ویو یا ری اکت بزاری نه بک اندشخص A: آموزش و یادگیری سالیدیتی مستقل از یادگیری بک‌انده. یعنی اگر شما بک‌اند رو ندونی، می‌تونی به سادگی سالیدیتی رو یاد بگیری. این دو تا از هم جدا هستند.ولی، شما در یک پروژه قصد داری بین کاربر و قرارداد هوشمند تعامل و ارتباط برقرار کنی. یعنی کاربر بهش داده بده یا ازش داده بگیره. در این صورت از ماژول‌های موجود استفاده می‌کنی که این کار رو انجام میدن. حالا، مسأله اینه که ماژول‌ها رو کجا بنویسیم؟ تو بک یا فرانت؟ این کاملا به نوع پروژه و محصول نهایی شما بستگی داره. اگر قرار نیست که محصول نهایی شما هیچ داده‌ای رو در هیچ کجا نگه‌داری کنه و داده‌های لازم، در سمت کلاینت نگه‌داری بشن، اون وقت شما از این ماژول‌ها در طرف فرانت استفاده می‌کنید. در غیر این صورت، در طرف سرور. هر چند، در حالت دوم میشه به فراخور پروژه این ماژول‌ها رو در فرانت نوشت.شخص B: دوست من داری اشتباه میزنی ، داده ها تو بلاکچین از طریق قرارداد هوشمند ذخیره میشن و برای تعامل هم نیاز به فرانت هست ، قرارداد هوشمند حکم همون بک اند رو داره و بلاکچین حکم همون دیتابیس رو و ماشین مجازی اتریوم حکم هاستیو داره که در برنامه های متمرکز فایلای شما روش اجرا میشه ، هیچ نیازی به یادگیری بک اند نیست در واقع زبان بک اند همین سالیدیتیه.شخص A: بذار با یه مثال برات روشن کنم:فرض کن یه کنسرسیوم از چند بانک داریم که می‌خوان اطلاعات مشتریانشون رو با هم به اشتراک بذارن. این کنسرسیوم روی بلاک‌چینه و هر بانک (نه هر شعبه) یه قرارداد هوشمند داره. برای هر بانک یه درگاه آنلاین طراحی شده تا متصدیان در هر شعبه از بانک، از طریق اون درگاه با قرارداد هوشمند بانکشون ارتباط بگیرن. روند کار هم به این شکله که وقتی مشتری در یک بانک حساب باز می‌کنه، متصدی که براش حساب باز کرده، وارد درگاه میشه و اطلاعات مشتری رو به قرارداد هوشمند بانک میده، این قرارداد اطلاعات رو به سایر بانک‌های کنسرسیوم میده تا در لجرشون ذخیره کنن. بانک‌ها قبل از ذخیره‌ی این اطلاعات در لجر، باید ابتدا اون رو به سمت دیتا سنترشون بفرستن، پردازش کنن سپس نتیجه‌ی پردازش رو به قرارداد هوشمند می‌فرستن تا در لجر ذخیره کنه.در همچین پروژه‌ای، ماژول web3js رو کجا require کنیم؟ در فرانت؟ اگه همه‌ی ماژول‌ها در فرانت آورده بشه چطوری با سرور و تجهیزات دیتا سنتر ارتباط بگیریم و داده‌ها رو بهش بدیم؟ ولی اگه از NodeJS استفاده کنیم و فایلش رو در سرورِ تعبیه شده در دیتا سنتر قرار بدیم، می‌تونیم دیتا سنتر رو به روز کنیم.در این مثال می‌بینید که قرارداد هوشمند فقط جزیی از بک‌انده نه همه‌ی بک‌اند و زنجیره‌ی بلوکی نمی‌تونه به تنهایی نقش دیتابیس رو ایفا کنه و اتصال به سایر دیتابیس‌ها در این مثال اجتناب‌ناپذیره.شخص B:?? اصلا مثالتون درست نبود به نظرم مگه هرکاری تو ی پروژه انجام میشه رو یک نفر باید انجام بده ؟الان اینستاگرام وب سایت داره اپ اندروید و ای او اس داره ، هوش مصنوعی داره و ... همش رو یک نفر انجام میده ؟ در این پروژه شما بخش بک اند کاملا مجزاست از قرارداد هوشمند و باید افراد مختلفی انجامش بدنتو همه ی درخواست کارها هم ببینین برنامه نویس سالیدیتی و وب 3 میخوان ک یک شخص باید بلد باشه اصلا شرط لازمی نیست و کاملا اختیاریه بک اندشخص A: تو مثالی که گفتم بک‌اند و قرارداد هوشمند جدا نیستند. web3js رو در NodeJS ری‌کوآیر می‌کنیم و NodeJS رو در سرور مستقر در دیتا سنتر قرار می‌دیم. اطلاعات مشتری بعد از پردازش در سرور، توسط سرور به سمت قرارداد هوشمند فرستاده میشه. پس باید در سرور ( و در NodeJS) قرارداد هوشمند رو تعریف کرده و باهاش اتصال و ارتباط برقرار کنیم. به همین علت web3js رو اونجا require می‌کنیم. حالا فرض کنین یه برنامه‌نویس، قرارداد هوشمند رو کد بزنه، web3js رو هم کد بزنه ولی هیچ دیدی نسبت به بک‌اند نداشته باشه. چطوری می‌تونه از پس این پروژه بر بیاد؟ مثلا ما بخوایم به ازای هر تعامل با قرارداد هوشمند یا به ازای هر ثبت اطلاعات مشتری در قرارداد هوشمند، یه لاگ در سرور ثبت بشه. اگه این برنامه‌نویس emit کردن ایونت‌ها رو ندونه، ندونه چطوری باید با promieventها رفتار کنه، چه خروجی می‌تونه به ما بده؟ از اون طرف، اگه تو این پروژه یه بک‌اند دولوپر داشته باشیم که بلاک‌چین دولوپر نباشه، چطوری می‌تونه بهش کمک کنه وقتی خروجی‌های web3js رو نمی‌شناسه، ارورهای web3js رو نمی‌شناسه؟ اگه یه ارور web3js در بک‌اند رخ بده از کجا بفهمه مشکل از چیه؟خیلی مهمه که یه بلاک‌چین دولوپر بک‌اندش قوی باشه. هر چند می‌تونه آفرهایی رو پیدا کنه که به کار با بک‌اند نیازی ندارن.شخص B: ممنون از توضیحاتت حق با شماست کاملا اولویت اخر بک اند می‌تونه باشه برای کسی که تازه میخواد شروع کنه و دیدی که شما داشتین خیلی جذاب بود واسم و خیلی حرفه ای تر به قضیه نگاه کردین ، باعث شدین من هم به فکر تقویت بک اند بیفتم چون قطعا پیشنهادهای کار بهتری بدست میاد❤️</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 19 Sep 2022 15:06:24 +0430</pubDate>
            </item>
                    <item>
                <title>سوالاتی که به عنوان کارجو می‌توانید از مصاحبه کننده بپرسید!</title>
                <link>https://virgool.io/fboard/reverse-interview-fqef3fpu0mxh</link>
                <description>این، لیستی از سوالاتی است که ممکن است برای یک متقاضی شغل فنی و مهندسی جالب باشد. ایده‌ها وحی منزل نیستند و لزوما بسیاری از آنها برای یک موقعیت خاص یا نوع کاری ممکن است مناسب نباشند. این، به عنوان لیست شخصی من از سؤالات شروع شد، که با گذشت زمان افزایش یافت و شامل مواردی شد که می خواهم ببینم و خط قرمزهایی که می خواهم از آنها اجتناب کنم. همچنین متوجه شده‌ام که افرادی که با آنها مصاحبه کردم چقدر سؤالات کمی پرسیدند و فکر می‌کنم این فرصت‌ها از دست رفته بودند.نحوه استفاده از این لیستبررسی کنید که کدام سؤال به طور خاص برای شما جالب استبررسی کنید که کدام پاسخ‌ها را می‌توانید در اینترنت پیدا کنیدوگرنه از مصاحبه‌کننده بپرسقطعا سعی نکنید همه سوالات این لیست را بپرسید. (به وقت مصاحبه‌گر احترام بگذارید و با یافتن پاسخ‌هایی که قبلاً منتشر شده‌اند، ابتکار عمل نشان دهید)به یاد داشته باشید که چیزها معمولاً پویا هستند، سازماندهی مجدد اغلب اتفاق می افتد. داشتن یک سیستم ردیابی اشکال، رسیدگی به اشکال را کارآمد نمی کند و CI/CD به این معنی نیست که زمان شما برای ارائه لزوما کوتاه است.نقشبرنامه زمانی و دفعات on-call بودن چگونه است؟ (هزینه پرداختی آماده به کار و فراخوان چقدر است)کارهایی که در یک روز معمول انجام می دهم چیست؟آیا اهداف خاصی برای من وجود دارد؟تراز جونیور به سنیور در تیم چه شکلی است؟ (و آیا برنامه ای برای تغییر آن وجود دارد)فرآیند onboarding به چه صورت انجام می‌شود؟هر توسعه دهنده چقدر آزادی عمل دارد؟ساعت کاری مورد انتظار چقدر است؟تعریف شما از موفقیت برای این نقش چیست؟در ۱ یا ۳ ماه اول، انتظار دارید چه کاری انجام دهم؟عملکرد من را در پایان دوره آزمایشی چگونه ارزیابی خواهید کرد؟یک روز/هفته معمول در این نقش چگونه است؟آیا در مورد درخواست من نکته‌ای به نظرتان میرسد؟به من بگویید که با چه کسی بیشتر کار خواهم کرد.مدیر مستقیم من و مدیر آنها چه سبک مدیریتی دارند؟ (از خرد تا کلان)چگونه می توانم در نقش جدید خود پیشرفت کنم / چه فرصت هایی ارائه می شود؟سوالات فنی (Tech)استک رایجی که در شرکت استفاده می شود چیست؟چگونه از کنترل کد منبع استفاده می کنید؟چگونه کد را تست می کنید؟چگونه اشکالات را ردیابی می کنید؟چگونه پروژه ها را مانیتور می کنید؟چگونه تغییرات را ادغام و دیپلوی می کنید؟ آیا CI/CD است؟آیا راه اندازی زیرساخت شما تحت کنترل نسخه است / به عنوان کد موجود است؟جریان کاری از برنامه ریزی تا اتمام تسک چه شکلی است؟چگونه برای disaster ریکاوری آماده می‌شوید؟آیا یک محیط توسعه استاندارد وجود دارد؟ آیا اجرا می شود؟با چه سرعتی می توانید یک محیط تست لوکال جدید برای محصول راه اندازی کنید؟ (دقیقه / ساعت / روز)چقدر سریع می توانید به مشکلات امنیتی در کد یا وابستگی ها واکنش نشان دهید؟آیا همه توسعه‌دهندگان دسترسی ادمین لوکال از سیستمشان دارند؟درمورد اصول یا دیدگاه فنی خود به من بگویید.آیا برای کدبیس، داکیومنتی برای توسعه‌دهندگان دارید؟ آیا داکیومنت جداگانه‌ای برای مشتریان دارید؟آیا داکیومنت‌های سطح بالاتری دارید؟ (نمودارهای ER، شمای پایگاه داده)آیا از تحلیل کد استاتیک استفاده می کنید؟چگونه آرتیفکت‌های داخلی/خارجی را مدیریت می کنید؟چگونه وابستگی‌ها را مدیریت می کنید؟تیمکار چگونه سازماندهی می شود؟ارتباط درون تیمی یا بین تیمی معمولاً چگونه کار می کند؟آیا از ابزاری برای سازماندهی پروژه استفاده می کنید؟ تجربه شما از آنها چیست؟اختلاف نظرها چگونه حل می شود؟چه کسی اولویت ها / برنامه زمانی را تعیین می کند؟وقتی تیم به تارگت ریلیز نمیرسد چه می‌شود؟چه نوع جلساتی هر هفته برگزار می‌شود؟آیا جلسات مرتب با منیجرم خواهم داشت؟برنامه زمانی ریلیز محصول/سرویس چیست؟ (هر n هفته یک ریلیز/ دیپلوی مداوم/ جریان‌های ریلیز چندگانه/ …)پس از بروز حوادث در پروداکشن چه اتفاقی می افتد؟ آیا فرهنگ تحلیل بدون سرکوفت وجود دارد؟چه چالش‌هایی وجود دارد که تیم تجربه می‌کند و شما هنوز آنها را حل نکرده‌اید؟چگونه پیشرفت کار را دنبال می کنید؟انتظارات و اهداف چگونه تعیین می شوند و چه کسی این تنظیم را انجام می دهد؟کد ریویو در اینجا به چه صورت است؟مرحله به مرحله یه اسپرینت روتین در تیم را توصیف کنید.چگونه بین اهداف فنی و تجاری تعادل برقرار می کنید؟چگونه دانش را به اشتراک می گذارید؟تیم ها چقدر بزرگ هستند؟همکاران بالقوه شماتوسعه دهندگان تمایل دارند از چه کسانی یاد بگیرند؟چه چیزی را در مورد کار در آنجا بیشتر دوست دارید؟چه چیزی را کمتر دوست دارید؟اگر می توانستی چه چیزی را تغییر می دادی؟طولانی ترین عضو تیم چه مدت آنجا بوده است؟اگر یک تیم کوچک است، آیا تجربیاتی از شخصیت های متضاد وجود داشته است و چگونه با آن برخورد شد؟شرکتچرا شرکت استخدام می کند؟ (رشد محصول / محصول جدید / نوسان / ...)آیا بودجه کنفرانس/سفر وجود دارد و قوانین استفاده از آن چیست؟روند ارتقاء چیست؟ الزامات / انتظارات چگونه بیان می شود؟فرآیند بررسی عملکرد چگونه است؟آیا مسیر شغلی فنی و مدیریتی جداگانه ای وجود دارد؟آیا منابعی در سطح شرکت برای یادگیری در دسترس است، مانند اشتراک کتاب های الکترونیکی یا دوره های آنلاین؟آیا بودجه ای برای گرفتن سرتیفیکیت وجود دارد؟مرحله بلوغ چیست؟ (پیدا کردن مسیر اولیه / کار ویژه / تعمیر و نگهداری / ...)آیا می توانم در پروژه های FOSS مشارکت کنم؟ آیا تاییدیه ای لازم است؟آیا قراردادهای غیر رقابتی یا عدم افشا وجود دارد که از من خواسته شود امضا کنم؟شرکت را در ۵-۱۰ سال آینده کجا می بینید؟کد تمیز برای اکثر توسعه دهندگان در اینجا چه معنایی دارد؟آخرین باری که متوجه رشد شخصی در اینجا شدید چه زمانی است و به چه صورت رشد کرده است؟در اینجا موفقیت به چه معناست و چگونه موفقیت را می سنجید؟آیا فعالیت ورزشی / تیم سازی وجود دارد؟آیا هکاتونی وجود دارد که به صورت داخلی انجام شود؟آیا این شرکت از پروژه های متن باز پشتیبانی می کند؟تیم/شرکت میزبان چه رویدادهای اجتماعی است و آیا همه در این رویدادها حضور دارند؟چرا شرکت تصمیم به استخدام یک فرد خارجی برای ارتقای یک کارمند داخلی گرفت؟مسائل اجتماعیوضعیت / دیدگاه در مورد استخدام های متنوع چگونه است؟به نظر شما چه شکاف هایی در فرهنگ شرکت وجود دارد؟ (و فرهنگ شرکت چیست؟)تعادل کار و زندگی در اینجا به چه معناست؟آیا این شرکت در مورد تغییرات آب و هوایی موضعی دارد؟تعارضاختلاف نظرها چگونه حل می شود؟بعد پوش‌بک چه اتفاقی می‌افتد؟ (“این را نمی‌توان در زمان پیشبینی شده انجام داد”)وقتی تیم تحت فشار است و متعهد می شود که بیش از ظرفیت / سرعت خود کار کند چه اتفاقی می افتد؟اگر کسی زمینه های بهبود فرآیند / فناوری / غیره را شناسایی کند، چه اتفاقی می افتد؟وقتی بین انتظارات از مدیریت و عملکرد یک مهندس یا تیم فاصله وجود دارد، چه اتفاقی می‌افتد؟آیا می توانید داستانی در مورد یک وضعیت سمی و نحوه برخورد شرکت با آن به من بگویید؟تجارتآیا شرکت شما سودآور هستید؟اگر نه، ظرفیت شما چقدر است؟بودجه از کجا می آید و چه کسی بر طرح/جهت سطح بالا تأثیر می گذارد؟شرکت شما چگونه پول در می آورد؟چه چیزی شما را از کسب درآمد بیشتر باز می دارد؟برنامه رشد شرکت برای 1 سال آینده چیست؟ 5 سال؟چالش های بزرگی که پیش رو می بینید چیست؟چه چیزی را به عنوان مزیت رقابتی خود شناسایی کرده اید؟دورکارینسبت کارمندان دورکار به حضوری چقدر است؟آیا شرکت سخت افزار ارائه می دهد و برنامه به روز رسانی چیست؟نظر شما در مورد BYOD چیست؟ آیا در حال حاضر سیاست هایی پیرامون آن وجود دارد؟آیا خرید لوازم جانبی/مبلمان اضافی از طریق شرکت امکان پذیر است؟ آیا بودجه ای برای آنها وجود دارد؟آیا بودجه ای برای فضای کار مشترک یا دسترسی به اینترنت وجود دارد؟هر چند وقت یک بار انتظار می رود که از دفتر بازدید شود؟آیا اتاق های جلسات اداری همیشه برای کنفرانس های ویدئویی آماده هستند؟چیدمان ساختمانچیدمان دفتر چگونه است؟ (پلان باز / اتاقک / دفاتر)آیا تیم پشتیبانی / بازاریابی / دیگر تیمی نزدیک به تیم جدید من وجود دارد؟باقی سوالاتبهترین و بدترین جنبه کار در این نقش / تیم / شرکت چیست؟چه چیزی باعث شد که در ابتدا کار در این شرکت انتخاب کنید؟چه چیزی شما را در شرکت نگه می دارد؟جبران خسارتاگر طرح پاداش دارید، پاداش ها چگونه تعیین می شوند؟اگر یک طرح پاداش دارید، روتین درصدهای پاداش در چند سال گذشته چقدر بوده است؟آیا برنامه 401k یا برنامه بازنشستگی دیگری دارید؟ اگر چنین است، آیا شرکت با کمک های طرح اضافی مطابقت دارد؟آیا مزایای پزشکی وجود دارد و اگر چنین است، چه زمانی شروع می شود؟آیا برای جابجایی هزینه می کنید؟زمان استراحتمدت زمان مرخصی با حقوق (PTO) چقدر ارائه می شود؟زمان بیماری و مرخصی از هم جدا هستند یا خیر؟آیا می توانم از زمان تعطیلات قبل از تخصیص آن استفاده کنم و به طور موثر وارد تراز PTO منفی شوم؟سیاست roll over برای PTO چیست؟سیاست مرخصی والدین چیست؟سیاست مرخصی بدون حقوق چیست؟سیاست مرخصی تعطیلات چیست؟منابع دیگرایده‌های بیشتری برای سوالات می‌توانید اینجاها بیابید:The Joel Test: 12 Steps to Better Code by Joel SpolskyQuestions I&amp;amp;#x27;m asking in interviews by Julia EvansCurated list of salary negotiation advices by Peter Mekhaeilمنبع:https://github.com/viraptor/reverse-interview </description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Sun, 11 Sep 2022 17:55:56 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی Local Storage در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/using-the-local-storage-in-js-bwvp6ogkwdmf</link>
                <description>سلام دوستان جاوااسکریپتی. توی این پست با یکی از کاربردی‌ترین ویژگی‌های جاوااسکریپت یعنی Local Storage آشنا می‌شیم و یاد می‌گیریم که چطور از اون استفاده کنیم Local Storage چیه؟Local Storage یک مکان ذخیره‌سازی هست که توی مرورگر کاربر وجود داره که این امکان رو به ما میده تا با جاوا اسکریپت یه سری اطلاعات رو ذخیره و استفاده کنیم. در واقع عملیات ثبت، خواندن، بروزرسانی و حذف (CRUD) رو می‌تونیم با فضایی که در اختیار داریم انجام بدیم. اطلاعاتی که در Local Storage ذخیره میشه دائمی هست. یعنی اگه کاربر تب مرورگر و یا حتی خود مرورگر رو ببنده، این اطلاعات حذف نمیشن.متدهای Local StorageLocal Storage چهار متد در اختیار ما قرار داده تا عملیات CRUD رو انجام بدیم. این 4 متد شامل:setItem()getItem()removeItem()clear()که این چهار مورد رو با هم بررسی می‌کنیم.setItem()این متد برای زمانی استفاده میشه که می‌خوایم یه سری اطلاعات رو توی Local Storage ثبت و یا اطلاعات قبلی رو ویرایش کنیم. این متد دو آرگومان می‌گیره. اولی کلید اون مقداری که قراره ثبت یا ویرایش بشه. پارامتر دوم شامل مقدار این کلید هست:localStorage.setItem(&#039;name&#039;, &#039;James Rodriguez&#039;);تو این مثال name کلید و James Rodriguez مقدار این کلید هست.این مثال خیلی ساده بود. ما می‌تونیم یک مقدار پیچیده‌تر مثلاً یک آبجکت رو توی Local Storage ذخیره کنیم. باید دقت داشته باشیم که توی Local Storage باید رشته ذخیره کنیم. پس قبل از ذخیره آبجکت، باید اون رو تبدیل به رشته کنیم:const person = {
    name: &#039;Bastian&#039;,
    lastname: &#039;Schweinsteiger&#039;
};

person = JSON.stringify(person);

localStorage.setItem(&#039;user&#039;, person);getItem()همونطور که از اسمش پیداست، این متد برای گرفتن یک آیتم از Local Storage استفاده میشه. این متد یک پارامتر میگیره که اسم کلید اون آیتم مورد نظر ما هست. خروجی این متد یک رشته هست.مثال اول ما:const name = localStorage.getItem(&#039;name&#039;);
console.log(name); // James Rodriguezتوی مثال دوم چون آبجکت رو به رشته تبدیل کردیم، موقع فراخونی اون آیتم، باید دوباره به آبجکت تبدیلش کنیم:let user = localStorage.getItem(&#039;user&#039;);
user = JSON.parse(user);

console.log(user); // { &amp;quotname&amp;quot: &amp;quotBastian&amp;quot, &amp;quotlastname&amp;quot: &amp;quotSchweinsteiger&amp;quot }removeItem()این متد برای حذف کردن یک آیتم از Local Storge بکار میره. این متد یک ورودی میگیره که شامل کلید آیتم مورد نظر ما هست:localStorage.removeItem(&#039;user&#039;);

console.log(localStorage.getItem(&#039;user&#039;)); // nullclear()این متد همه آیتم‌هایی که توی LocalStorage وجود داره رو پاک میکنه. این متد هیچ پارامتری نمیگیره.localStorage.clear();دو تا نکتهدو تا نکته وجود داره که هنگام استفاده کردن از Local Storage باید در نظر داشته باشیم:حداکثر فضایی که در اختیار داریم 5 مگابایت هستاطلاعاتی که ذخیره میکنیم توسط مرورگر قابل دسترسی هست. پس باید حواسمون باشه اطلاعات حساس رو ذخیره نکنیمخب دوستان این مقاله هم به پایان رسید. امیدوارم استفاده کرده باشید. منتظر نظراتتون هستم. روزتون خوش ??️?Resources:https://sarahchima.com/blog/using-the-local-storage/https://ditty.ir/</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Sun, 28 Aug 2022 19:43:53 +0430</pubDate>
            </item>
                    <item>
                <title>پیش نیازهای جاوااسکریپتی قبل از ورود به ری‌اکت</title>
                <link>https://virgool.io/Solidity/javascript-skills-you-need-for-react-practical-examples-qfm8iagquzrb</link>
                <description>می‌خوایم با ویژگی‌هایی از جاوااسکریپت آشنا بشیم که بیشترین استفاده رو توی ری‌اکت دارن و هر توسعه‌دهندهٔ ری‌اکتی لازمه اونها رو بدونه!درود دوستان! شاید اگه به تازگی پا به دنیای فرانت‌اند گذاشته باشین، کار کردن با داغ‌ترین ابزارهای این حوزه مثل ری‌اکت، ویو، تایپ‌اسکریپت و ... خیلی وسوسه برانگیز باشه. ولی خب باید بدونیم که کار کردن با این ابزارها بدون دانش‌های پایه‌ای، مثل ساختن یک ساختمون بدون توجه پایهٔ اون هست یا مثل شروع یادگیری زبان انگلیسی با خوندن آثار ویلیام شکسپیر هست. اگه پایه قوی نباشه، علاوه‌بر اینکه صدها ساعت وقت و انرژی هدر میره، هیچ رشدی هم در کار نخواهد بود!این ابزارها از دور قشنگ و جذاب هستن. از نزدیک هم همینطور! به شرطی که از قبل آمادگی و شناخت داشته باشیم. ری‌اکت یک ابزار مبتنی بر جاوااسکریپت هست و توی این پست می‌خوایم ببینیم قبل از اینکه پا به دنیای ری‌اکت بذاریم، چه چیزهایی از جاوااسکریپت رو باید بدونیم.تقریباً برای همه مواردی که بهشون اشاره می‌کنیم، توی صفحه شخصی من در ویرگول مقاله‌های آموزشی اختصاصی وجود داره ??در ضمن پیشنهاد میشه نسخه صوتی بالارو گوش کنید بنظرم خیلی باحاله :))))))))))))))همهٔ ما در برهه‌ای از زمان (عکس از dev.to)  پیش نیازهای ورود به ری اکت۱. توابع جاوااسکریپتتوی دل هر برنامهٔ ری‌اکتی شاید بیشتر از هر چیز دیگه‌ای کامپوننت‌ها دیده بشن. یکی از رایج‌ترین راه‌های ساختن کامپوننت‌های ری‌اکتی استفاده از یک تابع هست:function Component1(props) {
  return &lt;h1&gt;Welcome dear {props.user.name}!&lt;/h1&gt;;
}

const Component2 = (props) =&gt; {
  return &lt;h1&gt;Welcome dear {props.user.name}!&lt;/h1&gt;;
}تابع جاوااسکریپت که می‌تونن به شکل‌های مختلف ساخته بشن، جزئیات مهمی مثل کلمه‌کلیدی this و Hoisting دارن که دونستن اونها اهمیت بالایی داره. برای درک توابع و همچنین موضوع‌های وابسته به اون، پست‌های زیر رو بخونید:توابع توی جاوااسکریپتکلمه‌کلیدی thisArrow Function ها به زبان سادهمفهوم Hoisting در جاوااسکریپتمفهوم اسکوپ‌ها (Scopes) در جاوااسکریپتکلوژرها در جاوااسکریپت&amp;amp;amp;amp;amp;lt;br/&amp;amp;amp;amp;amp;gt;۲. کلاس‌هایک راه دیگه برای ساختن کامپوننت‌های ری‌اکت استفاده از کلاس‌های جاوااسکریپت هست:class Car extends React.Component {
  constructor() {
    super();
    this.state = { color: &amp;quotBlack&amp;quot };
  }
  render() {
    return &lt;h2&gt;I am a {this.state.color} Car!&lt;/h2&gt;;
  }
}توی همین کامپوننتِ ساده نکته‌های زیادی مثل ارث‌بری، Constructor و کلمه‌کلیدی this وجود داره که برای آشنایی کامل با اونها می‌تونین این پست رو ببینین: https://virgool.io/Solidity/classes-in-javascript-vvfwtp1qdrbi ۳. Template Literalsتوی جاوااسکریپت روش‌های زیادی برای ساختن و کار با رشته‌ها وجود داره که Template Literals یک روش مدرن و کاربردی برای کار با رشته‌های پیچیده به حساب میاد. یک رشته با Template Literals با استفاده از کارکتر Backtick یا &#x60; ساخته میشه:const name = &amp;quotMario&amp;quot
console.log(`Welcome ${name}!`);


// In react
function User({ user }) {
  return (
    &lt;div className={`user-${user.type}`}&gt;
      ...
    &lt;/div&gt;
  );
}وقتی رشته‌های پیچیده داریم (مثلاً رشته‌های چند خطی یا رشته‌هایی که با یک عبارت جاوااسکریپتی میکس میشن) استفاده از Template Literals بهترین گزینه هست. چون باعث میشه کدهای خلاصه‌تر و خواناتر داشته باشیم.۴. شرط‌های کوتاه با عملگرهای Ternary و &amp;&amp; و ||استفاده از این عملگرها خیلی زیاد توی یک برنامهٔ ری‌اکتی دیده میشه:function User() {
  const isLoggedIn = true;  

  return &lt;h1&gt;Welcome {isLoggedIn ? &#039;User&#039; : &#039;Guest&#039;}&lt;/h1&gt;
}این راه در واقع یک راه کوتاه‌تر برای نوشتن چنین کدی هست:function User() {
  const isLoggedIn = true;  
  let message = &#039;&#039;;

  if (isLoggedIn) {
    message = &lt;h1&gt;Welcome User&lt;/h1&gt;;
  } else {
    message = &lt;h1&gt;Welcome Guest&lt;/h1&gt;;
  }

  return message;
}همچنین استفاده از عملگر Logial AND یا &amp;&amp; هم کاربردهای زیادی توی JSX داره:const isLoggedIn = true;

const el = (
  &lt;div&gt;
    { isLoggedIn &amp;&amp; &lt;LogoutButton /&gt; }
  &lt;/div&gt;
);توی این کد، کامپوننت LogoutButton فقط زمانی پردازش میشه که loggedIn یک مقدار truthy باشه. پس چنین عملگرهایی کمک می‌کنن تا کدهای خلاصه‌تری بنویسیم. https://virgool.io/Solidity/short-circuiting-nsb7eyzxxfwp  https://virgool.io/Solidity/short-circuiting-with-nullish-coalescing-operator-in-js-vopo6g4rsgfy ۵. متدهای کاربردی آرایه‌هاتوی ری‌اکت و مخصوصاً وقتی که با JSX سر و کار داریم، قطعاً متدهای زیادی از آرایه‌ها مثل map و filter و reduce به کارمون میان. درک اونها و نحوهٔ کارکردن اونها کمک می‌کنه تا برنامهٔ خلاصه‌تر و معنادارتر بنویسیم.برای مثال اگه یک آرایه داریم و می‌خوایم اعضای اون رو نمایش بدیم، چیزی که مستندات ری‌اکت بهمون پیشنهاد می‌کنه استفاده از متد map هست:const users = [&amp;quotMario&amp;quot, &amp;quotEmily&amp;quot, &amp;quotSarah&amp;quot, &amp;quotDavid&amp;quot];

&lt;ul&gt;
  {
    users.map(
      user =&gt; &lt;li key={user}&gt;{user}&lt;/li&gt;
    )
  }
&lt;/ul&gt;برای آشنایی بیشتر با این متدها این سری پست‌ها رو ببینین: https://virgool.io/Solidity/filter-find-map-array-function-in-javascript-un8bnhzn3zgd ۶. Destructuringدیستراکچِرینگ یکی از محبوب‌ترین ویژگی‌های جاوااسکریپت هست که کاربرد اون توی هر قسمتی از برنامه قابل لمس هست:function UserProfile&#40;{ user }&#41; {
  const [count, setCount] = useState(0);

  const { name, avatar } = user;
  const [avatarLarge, avatarSmall] = avatar;

  return &lt;img src={avatarLarge}&amp;quot /&gt;
}تصور کنین بدون این قابلیت چه حجم از کدهایی باید می‌نوشتیم:function UserProfile&#40;props&#41; {
  const countState = useState(0);
  const count      = countState[0];
  const setCount   = countState[1];

  const user   = props.user;
  const name   = user.name;
  const avatar = user.avatar;

  const avatarLarge = avatar[0];
  const avatarSmall = avatar[1];

  return &lt;img src={avatarLarge}&amp;quot /&gt;
}دیستراکچرینگ قابلیتی هست که هم برای آرایه‌ها و هم برای آبجکت‌ها در دسترسه که با لینک زیر می‌تونین کامل با اون آشنا بشین: https://virgool.io/Solidity/what-is-destructuring-in-js-a2axwe8krxqm ۷. اعضای Rest و عملگر Speardسه‌نقطه‌های جذاب ... درست مثل Destructuring از کاربردی‌ترین ویژگی‌هایی بودن که از ES6 به جاوااسکریپت اضافه شدن تا به کدهامون خوانایی و سرعت ببخشن:function UserProfile&#40;{user, children, ...otherProps}&#41; {
  return &lt;h1 {...otherProps}&gt;Welcome {user.name}&lt;/h1&gt;
}توی این کد که می‌خواستیم هر پراپرتی که به کامپوننت پاس داده میشه رو به h1 هم پاس بدیم، هم از عضو Rest استفاده شده (خط ۱) و هم از عملگر Spread (خط ۲). بدون استفاده از این قابلیت‌ها باید همه پراپرتی‌ها رو به صورت دستی می‌خوندیم و توی h1 می‌نوشتیم.برای آشنایی بیشتر با این ویژگی‌ها پست‌های زیر رو ببینین: https://virgool.io/Solidity/what-is-rest-in-js-wj2ryzlegxdi  https://virgool.io/Solidity/what-is-spread-in-js-rg4jufgh9fse ۸. ماژول‌های اکمااسکریپتاین روزها ساختن یک برنامهٔ بزرگ بدون ذهنیت ماژولار غیر قابل تصور هست. یک برنامهٔ مدرنِ ری‌اکتی برای قابل توسعه بودن از بخش‌های کوچک خیلی زیادی تشکیل میشه و این بخش‌ها با استفاده از قابلیت ماژول‌های ES به هم مرتبط میشن:// src/components/forms/index.js

import { TextField } from &#039;./TextField/TextField&#039;;
import { Select } from &#039;./Select/Select&#039;;
import { Radio } from &#039;./Radio/Radio&#039;;

export { TextField, Select, Radio };بدون استفاده از این ویژگی، هر فایل میزبان هزاران خط کدهای غیر مرتبط به هم هست که در نتیجه توسعه و خوانایی کدها افسانه‌ای بیش نخواهد بود. https://virgool.io/Solidity/modules-in-javascript-lihzculyngul ۹. پرامیس‌ها و Async/Awaitاین روزها عملیات ناهمگام (Asyncronous) مثل AJAX مثل نقل و نبات توی هر برنامه‌ای دیده میشه ? و جاوااسکریپتِ امروز حتماً راهی رو برای بهتر مدیریت کردن این عملیات در اختیار قرار داده که اون پرامیس هست. اگه برنامه‌نویس وب - چه فرانت‌اند و چه بک‌اند - هستین، یادگیری و درک پرامیس‌ها و Async/Await یکی از باید هاست! https://virgool.io/Solidity/promises-in-javascript-vaxvvmehvmtt  https://virgool.io/Solidity/javascript-async-await-ahl99etncebf ۱۰. ترفندهای آبجکت‌هاعلاوه‌بر ویژگی‌هایی مثل Destructuring، عملگر Spread و Rest که بالاتر باهاشون آشنا شدیم، آبجکت‌ها ترفندهای دیگه‌ای هم دارن که با اونها می‌تونیم مدرن‌تر، خلاصه‌تر و خواناتر کدنویسی کنیم. یکی از اونها نوشتن کوتاه‌تر نوشتن پراپرتی‌ها یا به قول معروف Property Shorthand هست:import {Triangle, Rectangle, Circle } from &#039;./shapes&#039;;

const components = {
  Triangle,
  Rectangle,
  Circle,
  other(shape) {
    return React.lazy(() =&gt; import(shape));
  }
};بدون این ویژگی، آبجکت components باید اینطوری نوشته میشد:import {Triangle, Rectangle, Circle } from &#039;./shapes&#039;;

const components = {
  Triangle: Triangle,
  Rectangle: Rectangle,
  Circle: Circle,
  other: function (shape) {
    return React.lazy(() =&gt; import(shape));
  }
};خب دوستان این قسمت هم تموم شد. مطمئناً چیزهایی که برای توسعهٔ یک برنامه امروزی وجود داره به همین مواردی که بررسی کردیم ختم نمیشه و چیزی که دوست دارم بهتون بگم اینه که تا می‌تونین جاوااسکریپتتون رو قوی‌تر کنین تا کار با ابزارهای اون راحت‌تر و البته لذت‌بخش‌تر بشه. روزتون خوش ?✌️Resources:https://kentcdodds.com/blog/javascript-to-know-for-reacthttps://www.freecodecamp.org/news/javascript-skills-you-need-for-react-practical-examples/https://www.w3schools.com/react/react_class.asphttps://www.taniarascia.com/react-architecture-directory-structure/https://ditty.ir/</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Sat, 27 Aug 2022 12:03:55 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی async و await در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/javascript-async-await-ahl99etncebf</link>
                <description>مدیریت عملیات ناهمگام با async/await رو توی این مقاله بررسی می‌کنیم.سلام دوستان! توی پست امروز می‌خوایم یکی از مهمترین ویژگی‌های جاوااسکریپت که توسط ES8 (ES2017) معرفی شده یعنی توابع async رو بررسی کنیم.این ویژگی برای مدیریت عملیات ناهمگام به کار میره و بهتره که قبلش بدونیم عملیات ناهمگام چی هست.عملیات ناهمگامیک سری عملیات توی جاوااسکریپت مثل اتصال به یک منبع خارجی با Ajax یا WebSocket و یا خوندن و نوشتن اطلاعات توی دیتابیس و هارددیسک، جدا از روند اصلی برنامه اجرا میشن. به این عملیات میگن عملیات ناهمگام. یعنی وقتی مفسر به اون قسمت از کد رسید که مثلا داره با یک منبع خارجی ارتباط برقرار می‌کنه، منتظر نتیجه‌ی این قسمت نمی‌مونه و به ادامه روند برنامه می‌پردازه. یک مثال ساده از عملیات ناهمگام Ajax هست:$.get(&#039;http://example.com/users&#039;, function(response) {
    console.log(`Don&#039;t wait for me!`);
});

console.log(`You see me sooner!`);توی مثال بالا console.log توی خط ۵ زودتر از اونی که توی خط ۲ هست اجرا میشه.یکی از رایج‌ترین و قدیمی‌ترین راه‌های مدیریت عملیات ناهمگام استفاده از توابع Callback هست که استفاده از اون خیلی راحت هست. وقتی عملیات نا‌همگام به پایان رسید، نتیجه‌ی این عملیات برای پردازش می‌تونه به یک تابع فرستاده بشه که به این تابع میگن Callback. توی مثال بالا آرگومان دوم متد get یک تابع Callback هست که نتیجه درخواست Ajax ما رو پردازش می‌کنه.استفاده از توابع Callback ظاهرا راحت هست. اما وقتی چند عملیات ناهمگام متوالی داشته باشیم چطور؟ یعنی برای مثال یک Ajax بعد از اجرا شدن یک Ajax دیگه:$.get(&#039;http://example.com/users&#039;, function(res1) {
    $.get(&#039;http://example.com/posts?users=&#039; + res1.users, function(res2) {

    });
});خب اینجا یکم کار سخت میشه. چون وقتی یک یا چند تابع Callback درون هم دیگه قرار می‌گیرن، علاوه بر اینکه ساختار کدهای ما زشت میشن، کدها تو در تو میشن و کار با اطلاعات و متغیرها و نهایتا مدیریت کد سخت میشه که به این قضیه میگن جهنم کال‌بک (Callback Hell).راه حل بهترتوی ES6 یک قابلیت به اسم پرامیس معرفی شده که می‌تونه تا حد زیادی این مشکل رو حل کنه. با استفاده از پرامیس‌ها، خوانایی کدهای بالاتر میره و همچنین مدیریت نتیجه موفقت‌آمیز یا خطای یک عملیات ناهمگام راحت‌تر میشه.بهتره قبل از بررسی توابع async با پرامیس‌ها آشنا بشیم. چون این توابع توی پشت پرده از پرامیس‌ها استفاده می‌کنن. (برای آشنایی کامل با پرامیس‌ها این مقاله اختصاصی رو بخونید)مثال Ajax ابتدای پست رو با پرامیس‌ها می‌نویسیم:let users = new Promise(function(resolve, reject) {
    $.get(&#039;http://example.com/users&#039;, function(response) {
        resolve(response);
    });
});


let posts = users.then(
    function(users) {
        return new Promise(function(resolve, reject) {
            $.get(&#039;http://example.com/posts?users&#039; + users, function(posts) {
                resolve(posts);
            });
        });
    }
);

posts.then(
    function(user_posts) { 
        console.log(user_posts);
    }
);توی خط اول ابتدا یک پرامیس نوشتیم که درخواست ‌Ajax اولی اجرا بشه. توی پرامیس‌ها، ما نتیجه‌ی عملیات رو می‌تونیم با متد then بررسی کنیم. متد then زمانی فراخونی میشه که داخل پرامیس resolve صدا زده بشه.خب همونطور که می‌بینیم با پرامیس‌ها چند تا اتفاق خوب میوفته. اول اینکه نتیجه‌ی درخواست رو می‌تونیم هرجایی از کد بررسی کنیم (توی توابع کال‌بک مجبور بودیم همه چیز رو تو در تو بنویسیم). دوم اینکه برای یک پرامیس می‌تونیم بی‌نهایت then ضمیمه کنیم. همچنین کدهای ما مرتب‌تر و مدیریت نتیجه موفقیت‌آمیز بودن یا خطای عملیات ساختار یافته‌تر میشه.بهتر از این هم هست؟ ?  بله بله! هرچند پرامیس‌ها برای حل مشکل Callback Hell معرفی شدن و تا حدی زیادی هم موفق بودن، همونطور که می‌بینیم پیچیدگی خاص خودشون رو دارن. کدهای اضافی (Boilerplate code) و حجیم.توابع Asyncخب بعد از معرفی پیش‌زمینه‌ها، موضوع اصلی این پست اینجا شروع میشه. توابع Async توسط ES8 به جاوااسکریپت اومده و برای راحت‌تر کردن مدیریت عملیات ناهمگام استفاده میشه. توابع async زیر پوست خودشون از پرامیس‌ها استفاده می‌کنن. نحوه استفاده از اون خیلی راحت هست. برای استفاده از این ویژگی برای مدیریت یک عملیات ناهمگام، ابتدا از کلمه کلیدی async هنگام تعریف کردن یک تابع استفاده می‌کنیم. کلمه async رو همیشه ابتدای تعریف تابع می‌نویسیم:async function users() {
    // ...
}وقتی از async استفاده می‌کنیم، یک کلمه کلیدی دیگه هم داریم به اسم await. وقتی کلمه کلیدی await در ابتدای یک عبارت قرار بگیره، کد ما صبر می‌کنه تا خروجی این عبارت مشخص بشه و بعد به سراغ خط‌های بعدی میره. از await بصورت زیر استفاده می‌کنیم:async function users() {
    let users = await getUsersFromServer();

    console.log(users);
}تابع getUsersFromServer به فرض قراره با یک درخواست Ajax اطلاعاتی از کاربرا از سرور برای ما بفرسته. وقتی کلمه کلیدی await قبل از این عبارت قرار بگیره، کد صبر می‌کنه تا خروجی این قسمت مشخص بشه و بعد میره سراغ خط‌های بعدی. اگه از await استفاده نکنیم، خروجی خط ۴ کد بالا ممکنه زودتر از خط ۲ مشخص بشه.یک نکته باید در نظر داشته باشیم که کلمه کلیدی await فقط باید درون تابعی استفاده بشه که از کلمه کلیدی async در ابتدای خودش استفاده می‌کنه. در غیر این صورت با خطا مواجه میشیم.نکته‌ی بعدی که باید در نظر داشته باشیم اینه که اگه عبارت جلوی await یک پرامیس نباشه، بعد از اتمام کارش، این عبارت خود به خود تبدیل به یک پرامیس resolve شده میشه.خروجی یک تابع async همیشه یک پرامیس هست و می‌تونیم مثل یک پرامیس با اون رفتار کنیم:async function users() {
    let users = await getUsersFromServer();

    return users;
}

users.then(console.log); // list of usersکد زیر رو در نظر بگیرید. تابع numbersFromServer یک عملیات ناهمگام رو انجام میده که یک ثانیه طول میکشه و به فرض قراره یک سری اعداد رو از سرور بگیره (که من برای شبیه‌سازی از اعداد تصادفی استفاده کردم)let numbersFromServer = () =&gt; {
    return new Promise(function(resolve, reject) {
        setTimeout&#40;function(&#41; {
            var numbers = randomNumbers();
            resolve(numbers);
        }, 1000);
    });
}

function randomNumbers() {
    return Array(5).fill().map(() =&gt; Math.round(Math.random() * 100))
}اگه بخوایم خروجی تابع numbersFromServer رو با پرامیس‌ها پردازش کنیم کد ما شبیه به این میشه:numbersFromServer()
    .then(numbers =&gt; numbers.sort())
    .then(sorted =&gt; sorted.reverse())
    .then(reversed =&gt; reversed.join())
    .then(console.log);و اگه با توابع async بخوایم بررسی کنیم:async function render() {
    let numbers = await numbersFromServer();

    var sorted = numbers.sort();
    var reversed = sorted.reverse();
    var joined = reversed.join();

    console.log(joined);
}

render();همونطور که می‌بینیم کدهای ما با async در مقایسه با پرامیس‌ها که باید از متدهای زنجیره‌ای استفاده می‌کردیم، ساده‌تر و خواناتر شدن.خب ابتدای این پست از مشکلات توابع Callback گفتیم که وقتی تو در تو و زیاد بشن مشکلی به اسم Callback Hell درست می‌کنن. توی چنین شرایطی از توابع async استفاده می‌کنیم. ابتدا توابعی که توی مثال اول پست تو در تو بودن رو بصورت مجزا تعریف می‌کنیم. توی کد زیر تابع users یک سری کاربرا رو از سرور می‌گیره. همچنین تابع grades به عنوان آرگومان یک لیست از کاربرا رو می‌گیره و نمرات اونها رو برمی‌گردونه:let users = () =&gt; {
    return new Promise(function(resolve, reject) {
        setTimeout&#40;function(&#41; {
            var users = [&#039;John&#039;, &#039;Donald&#039;, &#039;Sarah&#039;];
            resolve(users);
        }, 1000);
    });
}

// ...

let grades = (users) =&gt; {
    return new Promise(function(resolve, reject) {
        setTimeout&#40;function(&#41; {
            console.log(&#039;Grades for: &#039; + users.join());
            var grades = [1, 2, 3, 4];
            resolve(grades);
        }, 1000);
    });
}حالا با استفاده از یک تابع async از این توابع استفاده می‌کنیم:async function render() {
    let usersFromServer = await users();
    let gradesFromServer = await grades(usersFromServer);
    
    var sorted = gradesFromServer.sort();
    var reversed = sorted.reverse();
    var joined = reversed.join();

    console.log(joined);
}

render();تمیزی و سادگی این مثال رو مقایسه کنین با مثال اول پست :) ?خب دوستان امیدوارم از این پست استفاده کرده باشین. منتظر نظراتتون هستم. موفق باشین ✌️?Resources :https://flaviocopes.com/javascript-async-await/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/awaitditty</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Fri, 26 Aug 2022 13:12:16 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی پرامیس‌ها (Promise) در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/promises-in-javascript-vaxvvmehvmtt</link>
                <description>یکی از پراستفاده‌ترین ویژگی‌های جاوااسکریپت که از ES6 به این زبان اضافه شده، پرامیس‌ها هستن که توی این قسمت می‌خوایم مفصل اونها رو بررسی کنیمسلام دوستان. ‌Promise که برای مدیریت کردن عملیات ناهمگام استفاده میشه، یکی از کاربردی‌ترین ویژگی‌های جاوااسکریپت هست که از ES6 به این زبان اضافه شده. توی این قسمت می‌خوایم این موضوع کاربردی رو بررسی کنیم.توی این قسمت یاد می‌گیریم که:مشکل کجاستپرامیس چیهresolve و reject چی هستناگه عملیات موفقیت‌آمیز بوداگه عملیات با خطا مواجه شدپاس دادن اطلاعات به Handler هاHandler های پشت سر هموضعیت‌های پرامیسمتد finallyمثال دنیای واقعیمشکل کجاست؟ ?ابتدا با مفهومی به اسم عملیات ناهمگام آشنا بشیم:عملیات ناهمگام به عملیاتی گفته میشه جدا از روند اصلی برنامه پردازش میشهتوی جاوااسکریپت، تابع setTimeout یکی از معروف‌ترین مثال‌ها برای درک مفهوم عملیات ناهمگام هست. با این تابع می‌تونیم قطعه کدی رو بعد از یک تأخیر معین اجرا کنیم. کد زیر رو در نظر بگیرین:setTimeout&#40;function (&#41; {
  alert&#40;1&#41;; // 1
}, 2000);

alert&#40;2&#41;; // 2ورودی اول setTimeout یک تابع هست و شامل عملیاتی میشه که می‌خوایم اون رو با تأخیر انجام بدیم. ورودی دوم مدت زمان تأخیر به میلی‌ثانیه هست. اینجا 2000 یعنی 2 ثانیه.بعد از اجرای کد می‌بینیم که ابتدا alert خط ۵ نمایش داده میشه و بعد از ۲ ثانیه alert خط ۲. این یعنی یک عملیات ناهمگام داریم. شاید انتظار داشتیم که جاوااسکریپت خط به خط کدهای ما رو بررسی کنه و خروجی‌ها رو نمایش بده. اما وقتی که جاوااسکریپت به قسمتی از کد رسید که شامل یک عملیات ناهمگام بود، منتظر نتیجه این قسمت نموند و به ادامه بررسی خط‌های بعدی پرداخت.توی جاوااسکریپت، یک سری عملیات مثل اتصال به یک منبع خارجی با Ajax و WebSocket و یا خوندن و نوشتن اطلاعات توی دیتابیس و هارددیسک، جدا از روند اصلی برنامه اجرا میشن. این یعنی عملیات ناهمگام.چطوری می‌تونیم بعد از به پایان رسیدن یک عملیات ناهمگام کاری رو انجام بدیم؟ مثلاً توی کد بالا ابتدا صبر کنیم کار تابعی که به setTimeout پاس دادیم تموم بشه و بعد alert با مقدار 2 رو بگیریم؟ باید راهی باشه که بتونیم عملیات ناهمگام رو مدیریت کنیم. با پرامیس‌ها این کار رو می‌تونیم انجام بدیم ?پرامیس چیه؟پرامیس‌ها برای مدیریت کردن عملیات ناهمگام استفاده میشن. نحوه نوشتن یک پرامیس خیلی راحته. ابتدا با ساختار اون بشیم و بعد مثال بالا رو با پرامیس خواهیم نوشت:new Promise(function (resolve, reject) {
  // do something ...
});همونطور که می‌بینیم، یک پرامیس با ساختن یک نمونه از کلاس ‌Promise با استفاده از کلمه‌کلیدی new ساخته میشه. کلاس پرامیس فقط یک آرگومان می‌گیره و اون هم یک تابع هست. این تابع که توی اون باید عملیات ناهمگامِمون رو بنویسیم، بلافاصله وقتی یک پرامیس ساخته شد اجرا میشه.حالا بیاین مشکلی که توی مثالمون داشتیم رو با پرامیس‌ها حل کنیم تا با ساختار اون بیشتر آشنا بشیم.const welcome = new Promise(function (resolve, reject) {
  setTimeout&#40;(&#41; =&gt; {
    alert&#40;1&#41;;
     resolve();
  }, 2000);
});

welcome.then(function () {
  alert&#40;2&#41;;
});با اجرای این کد ابتدا با یک تاخیر ۲ ثانیه‌ای alert با مقدار 1 می‌گیریم و بعد 2. اینطوری تونستیم عملیات ناهمگام رو مدیریت و به قول معروف هندل کنیم ?حالا چیزهایی که نوشتیم رو بررسی کنیم.resolve و reject چی هستن؟همونطور که می‌بینیم تابعی که به پرامیس پاس دادیم دو تا پارامتر می‌گیره که اولی resolve و دومی reject هست:new Promise(function (resolve, reject) {
  // ...هر دو پارامتر باید به شکل یک تابع توی پرامیس صدا زده بشن. یعنی:new Promise(function (resolve, reject) {
  resolve();
  // or
  reject();
});ما توی پرامیس باید به جاوااسکریپت بگیم که کارِ ما به پایان رسید. چون جاوااسکریپت خودش متوجه به پایان رسیدن این عملیات نمیشه. وقتی عملیات ما به پایان رسید، اگر خروجی کار موفقیت‌آمیز بود، باید resolve رو صدا بزنیم و اگر خطا داشت reject.اگه عملیات موفقیت‌آمیز بودتوی پرامیسی که نوشتیم توی خط ۴ resolve رو صدا زدیم به این معنی که عملیات ما با موفقیت به پایان رسیده:const welcome = new Promise(function (resolve, reject) {
  setTimeout&#40;(&#41; =&gt; {
    alert&#40;1&#41;;
     resolve();
  }, 2000);
});چرا باید به جاوااسکریپت بگیم که عملیات ما به پایان رسید؟ برای اینکه بتونیم بعد از به پایان رسیدن عملیات ناهمگام، کار مد نظرمون رو انجام بدیم. توی مثالی که داشتیم، کار مد نظرمون رو به این صورت انجام دادیم:welcome.then(function () {
  alert&#40;2&#41;;
});همونطور که می‌بینیم از متغیر welcome که مقدار اون یک پرامیس هست، یک متد به اسم then رو صدا زدیم و به اون تابعی رو پاس دادیم. این تابع بلافاصله زمانی اجرا میشه که ما توی پرامیس resolve رو صدا زده باشیم! پس کاری که می‌خوایم بعد از به پایان رسیدن عملیات ناهمگام اجرا بشه رو با then انجام می‌دیم.اگه عملیات با خطا مواجه شداگه عملیات ناهمگام با خطا مواجه شد، باید توی پرامیس reject رو صدا بزنیم:const welcome = new Promise(function (resolve, reject) {
  const status = &#039;failed&#039;;

  setTimeout&#40;(&#41; =&gt; {
    if (status === &#039;failed&#039;) {
       reject();
    }
  }, 2000);
});این کار به جاوااسکریپت میگه که عملیات ناهمگاممون موفقیت‌آمیز نبود. اگه بخوایم توی برنامه، reject شدن یک پرامیس رو مدیریت کنیم از متد catch که مشابه then هست استفاده می‌کنیم:const welcome = new Promise(function (resolve, reject) {
  const status = &#039;failed&#039;;

  setTimeout&#40;(&#41; =&gt; {
    if (status === &#039;failed&#039;) {
       reject();
    }
  }, 2000);
});

welcome.catch(function () {
  alert&#40;&amp;quotPromise failed!&amp;quot&#41;;
});همونطور که می‌بینیم، توی catch یک تابع تعریف کردیم. این تابع بلافاصله بعد از اینکه پرامیس reject شد اجرا میشه.به متدهای then و catch می‌گیم Handler به‌معنی کنترل‌کننده نتیجه عملیات ناهمگام.ما برای مدیریت کردن خطای پرامیس می‌تونیم بجای متد catch از آرگومان دوم متد then کمک بگیریم:const welcome = new Promise(function (resolve, reject) {
  reject();
});

welcome.then(
  function () { alert&#40;&amp;quotSucceeded&amp;quot&#41; },
   function () { alert&#40;&amp;quotFailed&amp;quot&#41; }
);تابعی که به آرگومان دوم پاس دادیم فقط زمانی اجرا میشه که reject صدا زده بشه. در واقع متد catch مشابه کد زیر هست:myPromise.then(null, function () {

});پاس دادن اطلاعات به Handler هاهر چیزی که به توابع resolve و reject پاس بدیم، توی متدهای then و catch قابل دسترس هست:const welcome = new Promise(function (resolve, reject) {
  resolve(&amp;quotHello!&amp;quot);
});

welcome.then(function (response) {
  alert&#40;response&#41;; // Hello!
});Handler های پشت سر همیک پرامیس وقتی که resolve میشه می‌تونه چندین Handler داشته باشه. به این معنی که بتونیم کارهای مختلفی رو انجام بدیم:const welcome = new Promise(function (resolve, reject) {
  resolve(1);
});

welcome.then(res =&gt; alert&#40;res + 1&#41;); // 2
welcome.then(res =&gt; alert&#40;res + 2&#41;); // 3
welcome.then(res =&gt; alert&#40;res + 3&#41;); // 4Handler های پشت سر هم می‌تونن به همدیگه بچسبن:const welcome = new Promise(function (resolve, reject) {
  resolve(1);
});

welcome.then().then().then();توی چنین شرایطی، خروجی هر then به then بعدی پاس داده میشه:const welcome = new Promise(function (resolve, reject) {
  resolve(&amp;quotHello&amp;quot);
});

welcome
  .then(res1 =&gt; res1.split(&amp;quot&amp;quot))      // [&amp;quotH&amp;quot, &amp;quote&amp;quot, &amp;quotl&amp;quot, &amp;quotl&amp;quot, &amp;quoto&amp;quot]
  .then(res2 =&gt; res2.reverse())      // [&amp;quoto&amp;quot, &amp;quotl&amp;quot, &amp;quotl&amp;quot, &amp;quote&amp;quot, &amp;quotH&amp;quot]
  .then(res3 =&gt; res3.join(&amp;quot&amp;quot))       // olleH
  .then(res4 =&gt; alert&#40;res4&#41;);        // olleHوضعیت‌های پرامیسدیدیم که نتیجه پرامیس یا موفقیت‌آمیز هست یا رد شده. در واقع یک پرامیس همیشه سه حالت داره: Pending - Rejected - Fulfilled۱. حالت Pendingاین حالت یعنی حالت انتظار. پرامیس در ابتدا و وقتی که ساخته میشه، در این حالت قرار داره:const asyncOpr = new Promise(function(resolve, reject) {
  // no resolve or reject
})

console.log(asyncOpr);این حالت تا زمانی که resolve یا reject صدا زده نشه باقی می‌مونه. کد را اجرا کنید و کنسول رو ببینین.۲. حالت Fulfilledحالت پرامیس وقتی resolve رو صدا بزنیم در حالت Fulfilled یعنی برآورده شده و موفقیت‌آمیز بودن قرار می‌گیره:new Promise(function (resolve, reject) {
  setTimeout&#40;function(&#41; {
     resolve();
  }, 1000);
});توی این کد، پرامیس بعد از ۱ ثانیه توی وضعیت Fulfilled قرار می‌گیره چون resolve رو صدا زدیم.۳. حالت Rejectedحالت پرامیس وقتی reject رو صدا بزنیم در حالت Rejected قرار می‌گیره. یعنی عملیات ناهمگام موفقیت‌آمیز نبود:new Promise(function (resolve, reject) {
  setTimeout&#40;function(&#41; {
     reject();
  }, 1000);
});توی این کد، پرامیس بعد از ۱ ثانیه توی وضعیت Rejected قرار می‌گیره چون reject رو صدا زدیم.نکته‌ای که باید در نظر داشته باشیم اینه که پرامیس فقط می‌تونه توی یک کدوم از حالت‌های Fulfilled و یا Rejected قرار بگیره:new Promise(function (resolve, reject) {
  resolve();
  reject();
});توی این کد، با توجه به اینکه resolve زودتر صدا زده شده، reject کلاً نادیده گرفته میشه. پس catch هم اجرا نخواهد شد:const welcome = new Promise(function (resolve, reject) {
  resolve();
  reject(); // ignored
});

welcome.then(() =&gt; {
  alert&#40;&amp;quotSuccess!&amp;quot&#41;; //Success!
});

welcome.catch(() =&gt; {
  alert&#40;&amp;quotFailed!&amp;quot&#41;;
});اما اگه reject زودتر صدا زده بشه، then نادیده گرفته میشه.متد finallyاگه کاری داریم که می‌خوایم در هر دو صورت (هم resolve شدن و هم reject شدن) انجام بدیم، از یک Handler دیگه به اسم finally استفاده می‌کنیم:const input = prompt&#40;&amp;quotEnter 1&amp;quot&#41;;

const welcome = new Promise((resolve, reject) =&gt; {
  if (input == 1) {
    resolve(&amp;quotSucceeded!&amp;quot);
  } else {
    reject(&amp;quotFailed!&amp;quot);
  }
});

welcome.then(alert);
welcome.catch(alert);

welcome.finally(() =&gt; {
  clearCache();
});

function clearCache() {
  alert&#40;&amp;quotProgram cache cleared!&amp;quot&#41;;
}همونطور که می‌بینیم کدی که توی خط  ۱۵ نوشتیم تحت هر شرایطی اجرا میشه. تابعی که به finally پاس دادیم هیچ آرگومانی قبول نمی‌کنه. چون نتیجه عملیات براش مهم نیست.بدون استفاده از finally کد بالا رو باید اینطوری می‌نوشتیم:welcome.then(
  function (success) { 
    clearCache();
  },
  function(error) {
     clearCache();
  }
);اما این راه مناسب نیست چون کد تکراری داریم می‌نویسیم.مثال دنیای واقعیتوی کد زیر تابعی داریم که با اون می‌تونیم اسکریپت‌های مختلفی (مثل جی‌کوئری، Axios و ...) رو از طریق URL به صفحه اضافه کنیم:function loadScript(path) {
  return new Promise((resolve, reject) =&gt; {
    const script = document.createElement(&#039;script&#039;);
    script.src = path;
    script. = () =&gt; resolve(path); 
    script. = () =&gt; reject(new Error(&#039;Whoops&#039;));
	 
    document.head.append(script);
  });
}توی این تابع یک پرامیس نوشتیم که توی اون اسکریپت رو به صفحه اضافه می‌کنیم و به محض اینکه اسکریپت دانلود بشه، پرامیس resolve میشه. توی تابع loadScript یک پرامیس داره return میشه. پس خروجی این تابع یک پرامیس هست.حالا می‌خوایم کتابخونه Axios که محبوب‌ترین ابزار برای ارسال درخواست‌های Ajax هست رو به صفحه اضافه و از اون استفاده کنیم:const loadAxios = loadScript(&amp;quothttps://unpkg.com/axios/dist/axios.min.js&amp;quot);الان مقدار متغیر loadAxios یک پرامیس هست و به محض اینکه اسکریپت مد نظرمون لود بشه می‌خوایم از اون استفاده کنیم. از متدهای then یا catch به صورت زیر استفاده می‌کنیم:loadAxios.then(() =&gt; {
  // Axios is loaded  
  axios.get(path);
});همونطور که می‌دونیم کتابخونه Axios هم مبتنی بر پرامیس‌ها هست. یعنی نتیجهٔ درخواست‌هایی که با اون می‌فرستیم رو می‌تونیم به شکل پرامیس‌ها مدیریت کنیم. توی این مثال می‌خوایم به یک آدرس خارجی یک درخواست Ajax بزنیم و نتیجه رو به کاربر نشون بدیم:const loadAxios = loadScript(&amp;quothttps://unpkg.com/axios/dist/axios.min.js&amp;quot);

loadAxios.then(() =&gt; {
  axios.get(&amp;quothttps://randomuser.me/api/?inc=name&amp;results=3&amp;quot)
    .then(response =&gt; {
      if (response.status === 200) {
        const users = response.data.results;

        for (const {name} of users) {
          alert&#40;`Welcome ${name.title} ${name.first} ${name.last}! ?`&#41;;
        }
      }
    });
});

function loadScript(path) {
  return new Promise((resolve, reject) =&gt; {
    const script = document.createElement(&#039;script&#039;);
    script.src = path;
    script. = () =&gt; resolve(path); 
    script. = () =&gt; reject(new Error(&#039;Whoops&#039;));
	 
    document.head.append(script);
  });
}با اجرای کد می‌بینیم که ابتدا Axios به صفحه اضافه میشه و بعد با استفاده از اون، درخواستی به آدرس مد نظرمون می‌زنیم تا اطلاعات رو به کاربر نشون بدیم. توی این برنامه ۲ بار از پرامیس‌ها استفاده کردیم ??خب دوستان این قسمت هم به پایان رسید و امیدوارم استفاده کرده باشید. برای ادامه آموزش به قسمت‌های بعدی برین. روزتون خوش ? ?Resources :ditty</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Fri, 26 Aug 2022 11:17:30 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی ماژول‌ها (Modules) در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/modules-in-javascript-lihzculyngul</link>
                <description>با ماژول‌ها می‌تونیم یک برنامه بزرگ رو به اجزای کوچیک‌تر تقسیم کنیم تا توسعه راحت بشه و هم خوانایی و نگهداری کد بالا بره. توی این قسمت با کلی نکته درباره ماژول‌ها توی جاوااسکریپت آشنا می‌شیم.سلام دوستان. ماژول‌ها یکی از مهمترین و پراستفاده‌ترین ویژگی‌ها توی دنیای جاوااسکریپت مدرن هستن و امروزه تقریباً هر برنامه‌ی بزرگ و کوچیکی از این ویژگی بهره می‌بره.درک ماژول‌ها و نحوه‌ی کاربرد اونها توی جاوااسکریپت اهمیت زیادی داره. چون ابزارهای امروزی مثل فریم‌ورک‌ها خیلی فراوون از این ویژگی استفاده می‌کنن. توی این قسمت با ماژول‌های جاوااسکریپت که توسط ES6 معرفی شدن آشنا می‌شیم و فواید اونها رو بررسی می‌کنیم.توی این قسمت یاد می‌گیریم که:ماژول چیه؟کلمه‌کلیدی exportexport default چیهکلمه‌کلیدی importوارد کردن همه چیزوارد کردن عضو export default شدهچرا از ماژول‌ها استفاده کنیماستفاده از یک ماژول توی مرورگرتو چه مرورگرهایی می‌تونیم با تگ script با ماژول‌ها کار کنیمماژول چیه؟ ?یک جمله معروف درباره ماژول‌ها یا بطور کلی اصل Separation of concerns (جداسازی وابستگی‌ها) وجود داره:نویسندگان خوب، کتاب‌ها رو به بخش‌ها و فصل‌های مجزا تقسیم‌بندی می‌کنن. برنامه‌نویس‌های خوب، برنامه‌ رو به بخش‌های مختلف تقسیم‌بندی می‌کنن.درست مثل یک کتابی که به فصل‌های مجزا تقسیم‌بندی میشه، یک برنامه می‌تونه به قسمت‌های مجزا تقسیم بندی بشه. به هر یک از این قسمت‌ها میگن ماژول (Module).یک ماژول معمولاُ مستقل از بخش‌های برنامه عمل می‌کنه. توی جاوااسکریپت هر ماژول بصورت یک فایل جداگونه ذخیره میشه و می‌تونه بدون مشکل به یک ماژول دیگه و یا به هسته برنامه اضافه یا برداشته بشه. اعضای یک ماژول (متغیرها، توابع و ... ) فقط توی خود ماژول قابل دسترسی هستن و Global نیستن.حالا وقت بررسی کردن این ویژگی توی جاوااسکریپت هست.ما با کلمه‌کلیدی import یک ماژول رو وارد برنامه می‌کنیم و فقط به اعضایی دسترسی داریم که توی ماژول export شده باشن. پس اول Export رو بررسی می‌کنیم.کلمه‌کلیدی exportبا کلمه‌کلیدی export می‌تونیم یک عضو از ماژول مثل یک متغیر رو قابل دسترسی کنیم. برای export کردن متغیرها، توابع، کلاس‌ها و ... از کلمه‌کلیدی export قبل از اون عضو استفاده می‌کنیم. ابتدا یک فایل به اسم دلخواه مثلا artist.js درست می‌کنیم با محتویات زیر:export const name = &amp;quotMathias&quot;
const favorites = [&amp;quotMusic&amp;quot, &amp;quotPainting&amp;quot];

export function play() {
  return &amp;quot?&quot;
}

export class Draw {
  start() {
    return &amp;quot?&quot;
  }
}توی ماژول بالا اعضایی که قبل از تعریف اونها از کلمه‌کلیدی export استفاده شده، قابل استفاده در بیرون ماژول هستن. پس به متغیر favorites بیرون از ماژول نمی‌تونیم دسترسی پیدا کنیم.اگه تعداد اعضای ما زیاد باشن، بجای نوشتن کلمه export قبل از هر عضوی، می‌تونیم آخر ماژول اونها بصورت زیر Export کنیم:const name = &amp;quotMathias&quot;
const favorites = [&amp;quotMusic&amp;quot, &amp;quotPainting&amp;quot];

function play() {
  return &amp;quot?&quot;
}

class Draw {
  start() {
     return &amp;quot?&quot;
  }
}

export { name, play, Draw };همچنین میشه یک عضو رو با نام دلخواه Export کرد. برای این کار از کلمه‌کلیدی as هنگام Export کردن استفاده می‌کنیم:const name = &amp;quotMathias&quot;

function play() {
  return &amp;quot?&quot;
}

export {
    name,
    play as playGuitar,
};export default چیه؟ما می‌تونیم مشخص کنیم به صورت پیشفرض، کدوم عضو در نظر گرفته بشه برای export شدن. برای این کار از کلمه‌کلیدی default بعد از export استفاده می‌کنیم:export default name = &amp;quotMathias&quot;
export const favorites = [&amp;quotMusic&amp;quot, &amp;quotPainting&amp;quot];یا به این صورت:const name = &amp;quotMathias&quot;
const favorites = [&amp;quotMusic&amp;quot, &amp;quotPainting&amp;quot];

export {
  name as default,
  favorites
}بصورت پیشفرض چیزی که ماژول بالا تحویل میده متغیر name هست، مگر اینکه موقع import، عضوی که لازم داریم رو صراحتاً صدا بزنیم. تا الان فقط Export کردیم. حالا باید از چیزایی که Export کردیم استفاده کنیم. برای این کار از کلمه‌کلیدی import استفاده می‌کنیم. توی ادامه با انواع نحوه‌ٔ import کردن آشنا می‌شیم.کلمه‌کلیدی importبرای استفاده از ماژول artist، یک فایل دیگه می‌سازیم به اسم app.js با محتویات زیر:import { name, playGuitar, Draw } from &#039;./artist&#039;;
console.log(name);
console.log(playGuitar());ما توی خط اول آیتم‌هایی که از ماژول artist احتیاج داریم رو جلوی کلمه import و توی { } نوشتیم. به نحوه آدرس دادن ماژول artist دقت کنید. &#x27;./artist&#x27; یعنی این ماژول توی همین مسیر هست. همچنین اگه پسوند فایل ماژول js هست، لازم نیست پسوند رو بنویسیم.می‌تونیم اعضای یک ماژول رو با نام دلخواه Import کنیم. برای این کار از کلمه‌کلیدی as هنگام وارد کردن استفاده می‌کنیم:import { name as artistName, playGuitar, Draw } from &#039;./artist&#039;;

console.log(artistName);وارد کردن همه چیزاگه همه‌ی اعضای یک ماژول رو لازم داریم از * بصورت زیر استفاده می‌کنیم:import * as myArtist from &amp;quot./artist&quot;

console.log(myArtist.name);توی این کد همه اعضای ماژول از طریق myArtist که اسم دلخواه ولی اجباری ما هست، مثل خط ۳ قابل دسترسی هستن.وارد کردن عضو export default شدهتوی قسمت export دیدیم که یک ماژول می‌تونه یک عضو رو به عنوان پیشفرض export کنه. حالا برای خوندن این مقدار پیشفرض بصورت زیر import می‌کنیم:import theArtistName from &#039;./artist&#039;;همونطور که می‌بینید دیگه از { } استفاده نشد. به عبارت دیگه، وقتی از { } استفاده نمی‌کنیم، به این معنی هست که می‌خوایم عضو پیشفرض رو import کنیم. همچنین theArtistName یک مقدار دلخواه هست که می‌تونه هر چیزی باشه:import table from &#039;./artist&#039;;

console.log(table); // Mathiasاگه در کنار عضو پیشفرض، به اعضای دیگه هم نیاز داشته باشیم به صورت زیر import می‌کنیم:import myCustomName, { play, Draw } from &#039;./artist&#039;;چرا از ماژول استفاده کنیم؟قابلیت نگهداریاز خوبی‌های استفاده از ماژول اینه که قابلیت نگهداری (Maintainability) برنامه‌ی ما بالاتر میره و بخش‌های مختلف رو میشه راحت‌تر توسعه داد. تصور کنین توسعه و انسجام یک برنامه با یک فایل ۱۰۰ خطی بهتره یا چهار فایل ۲۵ خطی؟ شاید بگیم اینطوری داره تعداد فایل‌ها بیشتر میشه. اما ما قسمت‌های بی‌ربط رو از هم جدا می‌کنیم تا کد ما معنادار بشه.استفاده مجدد از کدهایک تکه کد از برنامه که جاهای زیادی داره تکرار میشه رو می‌تونیم جدا و به یک فایل مجزا منتقل کنیم. هر وقت که خواستیم از این ویژگی استفاده کنیم کافیه فقط این فایل رو وارد کنیم.استفاده از یک ماژول توی مرورگربا type=&quot;module&quot; توی یک تگ script می‌تونیم از یک ماژول توی مرورگر استفاده کنیم. ابتدا یک ماژول بصورت زیر درست می‌کنیم تا از اون توی مرورگر استفاده کنیم:// add.js
export function add(x, y) {
  return x + y;
}حالا از ماژول بالا می‌تونیم بصورت زیر توی مرورگر استفاده کنیم:&lt;!-- ... --&gt;
&lt;body&gt;
  &lt;script type=&amp;quotmodule&amp;quot&gt;
    import { add } from &#039;./add.js&#039;;

    alert&#40;add(5, 10&#41;);
    alert&#40;add(15, 13&#41;);
  
&lt;/body&gt;توی کد بالا چیزی که توی script نوشتیم یک ماژول Local هست. باز هم می‌تونیم این ماژول رو ببریم توی یک فایل جدا و روی تگ script با src=&quot;...&quot; بهش آدرس بدیم:// app.js
import { add } from &#039;./add.js&#039;;

alert&#40;add(1, 4&#41;);
alert&#40;add(4, 29&#41;);و توی HTML:&lt;!-- ... --&gt;
&lt;body&gt;
  &lt;script type=&amp;quotmodule&amp;quot src=&amp;quot./app.js&amp;quot&gt;
&lt;/body&gt;نکته ۱: ماژول‌هایی که توی مرورگر تعریف می‌کنیم هم کپسوله هستن. یعنی به اجزای همدیگه دسترسی ندارن:&lt;!-- ... --&gt;
&lt;body&gt;
  &lt;script type=&amp;quotmodule&amp;quot&gt;
     var x = 12;
  

  
    alert&#40;x&#41;; // x is not defined
  
&lt;/body&gt;نکته ۲: از یک منبع خارجی نمی‌تونیم import کنیم و import ماژول‌ها توی مرورگر باید از همون منبع باشه. یعنی برای مثال اگه روی localhost هستیم، ماژولی که import می‌کنیم باید روی همین localhost باشه. در غیر این صورت مرورگر اجازه دسترسی نمیده. پس کدها بالا رو توی مرورگر از طریق localhost باز کنین.نکته‌هاحالت سخت‌گیرانه یا Strict Mode توی یک ماژول همیشه فعال هست. پس لازم نیست از &quot;use strict&quot; استفاده کنیم.مقدار this توی ماژول‌ها undefined هست.Resources:https://www.sitepoint.com/using-es-moduleshttps://alligator.io/js/modules-es6https://javascript.info/modules-introhttps://www.freecodecamp.org/news/javascript-modules-a-beginner-s-guide-783f7d7a5fcc/</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Wed, 24 Aug 2022 20:22:56 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی متدهای مهم و کاربردی آرایه‌های جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/filter-find-map-array-function-in-javascript-un8bnhzn3zgd</link>
                <description>توی این قسمت متدهای map ،find و filter که از مهمترین متدهای آرایه‌های جاوااسکریپت هستند رو بررسی می‌کنیمدرود دوستان! سه متد پرکاربرد از آرایه‌های جاوااسکریپت که توی این قسمت می‌خوایم رو بررسی کنیم:filter()find()map()متد Filterاین متد آرایه ما رو از یک فیلتر (شرط) عبور میده. خروجی این متد، یک آرایه جدید از آیتم‌هایی هست که شرط رو پاس کردن. پس هر وقت می‌خوایم یک آرایه جدید از اعضای دلخواه (فیلتر شده) داشته باشیم از این متد استفاده می‌کنیم.توی مثال زیر می‌خوایم اعضایی از آرایه رو داشته باشیم که بزرگتر از ۱۰ هستن:let numbers = [29, 5, 10, 11, 35];

let filtered = numbers.filter(item =&gt; item &gt; 10);
// [29, 11, 35]ساختار کلی متد filter بصورت زیر هست:let newArray = arr.filter(function(element, index, arr) {

});این متد یک تابع Callback (این توابع با رخ‌دادن یک رویداد خاص توی برنامه اجرا میشن) به عنوان ورودی می‌گیره. توی این تابع ما شرط فیلترمون رو می‌نویسیم. این شرط روی همه‌ی اعضای آرایه اعمال میشه و اعضایی که نتیجه‌ی شرط برای اونها true باشه از این فیلتر عبور می‌کنن. این تابع سه تا آرگومان قبول می‌کنه:elementاجباری هست و مقدار اون عضوی از آرایه هست که داره پردازش میشه.indexایندکس عضوی هست که داره پردازش میشهarrayشامل آرایه‌ای هست که متد filter داره روی اون کار می‌کنهlet numbers = [29, 5, 10, 11, 35];

let filtered = numbers.filter((number, index, array) {
  console.log(index);
  console.log(array);

  return number &gt; 10;
});

// 0  [29, 5, 10, 11, 35]
// 1  [29, 5, 10, 11, 35]
// 2  [29, 5, 10, 11, 35]
// 3  [29, 5, 10, 11, 35]
// 4  [29, 5, 10, 11, 35]توی مثال بعدی می‌خوایم اعضایی رو داشته باشیم که رنگ مورد علاقه‌ی اونها سبز هست:const users = [
    { name: &#039;Chris&#039;, color: &#039;Brown&#039; },
    { name: &#039;Napoleon&#039;, color: &#039;Green&#039; },
    { name: &#039;David&#039;, color: &#039;Blue&#039; },
    { name: &#039;Michael&#039;, color: &#039;Green&#039; },
];

const greenLovers = users.filter(
  user =&gt; user.color === &#039;Green&#039;
);

console.log(greenLovers);

/*
[
  { name: &#039;Napoleon&#039;, color: &#039;Green&#039; },
  { name: &#039;Michael&#039;, color: &#039;Green&#039; }
]
*/که البته filter رو با Object Destructuring میشه زیباتر هم نوشت:const greenLovers = users.filter(
  ({ color }) =&gt; color === &#039;Green&#039;
);متد Findاین متد اولین عضوی رو برمی‌گردونه که شرط مورد نظر ما برای اون برقرار باشه. استفاده از این متد برای زمانی خوبه که یک آرایه از چندین آبجکت داریم و این آبجکت‌ها هر کدوم شامل یک فیلد خاص مثلا id (شناسه) میشن. مثلا یک آرایه از کاربران که از پایگاه داده اومده. برای جستجوی یک شناسه‌ی خاص توی این آرایه کافیه از این متد استفاده کنیم:const users = [
    { id: 50, name: &#039;Chris&#039; },
    { id: 90, name: &#039;Napoleon&#039; },
    { id: 73, name: &#039;David&#039; },
    { id: 29, name: &#039;Michael&#039; },
];

let david = users.find(item =&gt; item.id === 73);

console.log(david); // { id: 73, name: &#039;David&#039; }به محض اینکه عضو مورد نظر ما پیدا شد، کار این متد متوقف میشه. همچنین اگه هیچ عضوی پیدا نشد خروجی این متد undefined هست. ساختار کلی متد find به صورت زیر هست:arr.find(function(element, index, arr) {

})این متد، یک تابع Callback رو به عنوان آرگومان قبول می‌کنه. به این تابع سه آرگومان میشه پاس داد که دقیقا مشابه چیزی هست که توی filter داشتیم.متد Mapاین متد، یک سری عملیات رو روی هر کدوم از اعضای آرایه اعمال می‌کنه و خروجی رو می‌ریزه تو یک آرایه جدید.توی مثال زیر می‌خوایم اعضای آرایه رو ضربدر ۲ کنیم:const numbers = [1, 2, 3];

const mulBy2 = numbers.map(item =&gt; item * 2);

console.log(mulBy2); // [2, 4, 6]همونطور که می‌بینیم تابعی که به این متد پاس داده شده، عملیات ضربدر ۲ رو روی همه‌ی اعضا اعمال کرد و نتیجه‌ی نهایی رو به خروجی داد. ساختار کلی متد map بصورت زیر هست:arr.map(function(element, index, arr) {

});درست مثل find و filter، این متد هم یک تابع به عنوان ورودی می‌گیره و این تابع خودش ۳ آرگومان می‌گیره که کارایی اون دقیقا مثل چیزی هست که توی متدهای قبلی داشتیم.چه زمانی از map استفاده نکنیم؟همونطور که گفته شد خروجی این متد یک آرایه جدید هست. اگه به آرایه جدید ساخته شده احتیاجی نداریم بهتره که از این متد استفاده نشه و بجای اون از حلقه‌های معمولی مثل forEach و for...of استفاده بشه.تابع پاس داده شده به متد map همیشه باید خروجی (return) داشته باشه. در غیر این صورت خروجی برای عضوی که داره پردازش میشه undefined هست:let numbers = [1, 2, 3, 4];

let filteredNumbers = numbers.map(function(num, index) {
  if (index &lt; 3) {
     return num;
  };

});

console.log(filteredNumbers); // [1, 2, 3, undefined]یک راه برای اینکه نوع اعضای یک آرایه رو از رشته به عدد تبدیل کنیم:[&#039;1&#039;, &#039;2&#039;, &#039;3&#039;].map(Number)  // [1, 2, 3]خب دوستان امیدوارم از این قسمت استفاده کرده باشین. روزتون خوش ? ‍✌️Resources:https://developer.mozilla.org/en-US/.../filterhttps://developer.mozilla.org/en-US/.../findhttps://developer.mozilla.org/en-US/.../map</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 22 Aug 2022 23:40:04 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی جامع کلاس‌ها (Class) در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/classes-in-javascript-vvfwtp1qdrbi</link>
                <description>با کلاس‌ها می‌تونیم آبجکت‌هایی داشته باشیم که همگی شامل یک‌سری پراپرتی و متدهای مشترک هستندرود دوستان. کلاس‌ها (Classes) از ES6 به جاوااسکریپت اومدن تا جایگزینی برای توابع Constructor باشن که یک روش سنتی برای ساختن آبجکت‌ها از یک طرح و الگوی اولیه به حساب میومد. این ویژگی کاربرد زیادی توی فریم‌ورک‌ها و کتابخونه‌هایی مثل ری‌اکت و انگولار داره.موارد زیر رو توی این قسمت یاد می‌گیریم:مشکل کجاستکلاس چیهساختن آبجکت از کلاس‌هاتعریف کردن متدهامتد constrcutorتعریف کردن پراپرتی‌هادسترسی به فیلدها از متدهاکلاس‌های والد، کلاس‌های فرزنددسترسی به اعضای کلاس والدفرزند و زیرفرزندبررسی کردن نوع آبجکتمشکل کجاست؟فرض کنیم آبجکتی داریم به صورت زیر:const emily = {
  name: &amp;quotEmily&amp;quot,
  age: 4,
  run() {
    alert&#40;`${this.name} is running`&#41;;
  }
}همونطور که می‌بینیم ۲ پراپرتی داریم و یک متد. حالا می‌خوایم چند آبجکت دیگه مشابه همین آبجکت داشته باشیم که فقط توی مقدار پراپرتی‌ها با هم تفاوت دارن. شاید راهی که به ذهنمون برسه این باشه که هر آبجکتی رو دقیقاً مثل همون آبجکت بالا و به صورت دستی بسازیم:const mario = {
  name: &amp;quotMario&amp;quot,
  age: 5,
  run() {
    alert&#40;`${this.name} is running`&#41;;
  }
}

const john = {
  name: &amp;quotJohn&amp;quot,
  age: 3,
  run() {
    alert&#40;`${this.name} is running`&#41;;
  }
}

// ...این کار چند مشکل داره:۱. داریم کدهای تکراری می‌نویسیم. متد run بدون تغییر توی همه آبجکت‌ها تکرار شده. کار زمانی سخت‌تر میشه که تعداد پراپرتی‌ها و متدهای ما زیاد باشن.۲. برای اضافه کردن یک پراپرتی به آبجکت، باید سراغ همه آبجکت‌ها بریم و به صورت دستی پراپرتی‌ها رو اضافه کنیم.کلاس‌ها برای حل چنین مشکل‌هایی به کارمون میان ?کلاس چیه؟کلاس، یک طرح و الگو برای ساختن آبجکت‌هاست. توی دنیای واقعی، واحد‌های یک ساختمون همگی ساختار منظم و یک‌شکل دارن. به این دلیل که از روی یک طرح و نقشه اولیه ساخته میشن. توی برنامه‌نویسی، به این طرح و نقشهٔ اولیه می‌گیم کلاس. با کلاس‌ها حجم کدهای ما پایین میاد و سرعت کدنویسی بالا میره.توی جاوااسکریپت، یک کلاس با استفاده از کلمه‌کلیدی class ساخته میشه:class User {

}توی این کد، User اسم کلاس ما هست و هر چیزی که داخل براکت‌ها بنویسیم، بدنهٔ این کلاس به حساب میاد. توی این بدنه ما پراپرتی‌ها و متدهایی رو تعریف می‌کنیم تا توی آبجکت‌ها در دسترس باشن!ساختن آبجکت از کلاس‌هاما با استفاده از کلمه‌کلیدی new که درست قبل از اسم کلاس قرار می‌گیره می‌تونیم آبجکت بسازیم:class User { }

const emily = new User();
const mario = new User();به آبجکت‌هایی که از یک کلاس ساخته میشه به اصطلاح می‌گیم نمونه یا Instance. الان متغیرهای emily و mario نمونه‌هایی هستن که هر دو از کلاس User ساخته شدن و دارای ویژگی‌هایی مشترکی هستن. اما هنوز هیچ ویژگی (پراپرتی و متد) تعریف نکردیم که توی این نمونه‌ها در دسترس باشن.تعریف کردن متدهامتدها رو می‌تونیم به صورت زیر توی کلاس تعریف کنیم تا توی همه نمونه‌ها در دسترس باشن:class User {
  welcome() {
    alert&#40;&amp;quotHello!&amp;quot&#41;;
  }

  login() {
    alert&#40;&amp;quotI&#039;m logging in&amp;quot&#41;;
  }
}

const emily = new User();
const mario = new User();

emily.welcome(); // Hello!
mario.login(); // I&#039;m logging inهمونطور که توی دو خط آخر می‌بینیم، متدهایی که توی کلاس تعریف کردیم توی نمونه‌ها در دسترس و قابل استفاده هستن.متد constrcutorهمه کلاس‌ها می‌تونن یک متد اختصاصی داشته باشن به اسم constructor که به صورت زیر تعریف میشه:class User {
  constructor() {
    // ...
  }
}این متد کاربرد جالبی داره: وقتی با کلمه‌کلیدی new می‌خوایم نمونه بسازیم، این متد به طور خودکار اجرا میشه:class User {
  constructor() {
    alert&#40;&amp;quotBravo&amp;quot&#41;;
  }
}

const mario = new User(); // Bravoهمونطور که می‌بینیم، برعکس متدهای دیگه لازم نیست این متد رو صدا بزنیم و خود به خود صدا زده شد. استفاده از اون برای زمانی خوبه که می‌خوایم نمونه‌ها رو موقع ساخته‌شدن شخصی‌سازی کنیم. همونطور که از اسم اون بر میاد: Constructor یعنی سازنده.شخصی‌سازی یک نمونه یعنی اینکه کاری کنیم پراپرتی‌هایی که توی نمونه‌ها وجود دارن بتونن مقدارهای متفاوتی از بقیه نمونه‌ها داشته باشن. مثلاً همه نمونه‌ها یک پراپرتی داشته باشن به اسم name اما مقدار اون توی هر آبجکت فرق کنه. توی ادامه یاد می‌گیریم که چطوری نمونه‌ها رو شخصی‌سازی کنیم.تعریف کردن پراپرتی‌هابرای اینکه بخوایم پراپرتی‌هایی داشته باشیم که توی همه نمونه‌ها در دسترس باشن از متد constructor و this کمک می‌گیریم:class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

const mario = new User(&amp;quotMario&amp;quot, 5);
const emily = new User(&amp;quotEmily&amp;quot, 4);

alert&#40;mario.name&#41;; // Mario
alert&#40;mario.age&#41;; // 5
alert&#40;emily.name&#41;; // Emilyتوی خط ۲ برای constructor دو پارامتر تعریف کردیم و که اونها رو موقع ساختن نمونه (خط‌های ۸ و ۹) باید پاس بدیم. توی constructor با استفاده از کلمه‌کلیدی this تونستیم ۲ پراپرتی بسازیم و مقدار اونها رو برابر با ورودی‌های این متد قرار بدیم. از حالا نمونه‌هایی که ساخته میشن شامل این ۲ پراپرتی با مقدارهای اختصاصی خواهند بود و مثل خط‌های آخر قابل دسترس هستن ?پراپرتی؟ فیلد؟ ?شاید واژه فیلد (Field) هم به گوشتون خورده باشه که با واژه پراپرتی بجای هم مورد استفاده قرار می‌گیرن. توی کد بالا و توی خط ۳ و ۴ ما در واقع فیلد تعریف کردیم. این فیلد با مقدارش زمانی که توی نمونه‌ها قرار می‌گیرن، با عنوان پراپرتی شناخته میشن. پس پراپرتی چیزی هست که توی نمونه‌ها و فیلد چیزی هست که توی کلاس‌ها داریم. توی خط‌های آخر کد بالا داریم پراپرتی‌ها رو فراخونی می‌کنیم.دسترسی به فیلدها توی متدهابا استفاده از کلمه‌کلیدی this می‌تونیم به فیلدها دسترسی داشته باشیم:class User {
  constructor(name) {
    this.name = name;
  }

  welcome() {
    return `Welcome ${this.name}!`;
  }
}

const mario = new User(&amp;quotMario&amp;quot);
alert&#40;mario.welcome(&#41;); // Welcome Mario!کلاس‌های والد؟ کلاس‌های فرزند؟ ?یک کلاس می‌تونه ویژگی‌های یک کلاس دیگه رو به ارث ببره. این کار که به اصطلاح به اون گفته میشه ارث‌بری، برای زمانی خوبه که می‌خوایم یک کلاس موجود رو توسعه (Extend) بدیم.ابتدا فرض کنیم کلاسی داریم به صورت زیر:class User {
  login() { }
  logout() { }
}توی این کلاس که برای کاربرها هست ۲ تا متد قرار دادیم. حالا می‌خوایم برای کاربرها قابلیتی رو اضافه کنیم که بتونن پست ارسال کنن:class User {
  login() { }
  logout() { }

  writePost() { }
  deletePost(id) { }
}دو متد writePost و deletePost رو اضافه کردیم. اما قابلیت ارسال پست رو قصد نداریم در اختیار همه کاربرها قرار بدیم. چون کاربرها ممکنه نقش‌های متفاوتی مثل نقش‌ها مدیرتی داشته باشن که در این صورت این دو متد اضافه شده برای اونها بی‌معنی هست. همچنین اگه بخوایم برای نقش‌های مدیریتی متدهایی رو اضافه کنیم، این متدها برای کاربرهای نویسنده بی‌معنی هست.یک راه بهتر اینه که برای کاربرهای نویسنده یا مدیر یک کلاس اختصاصی برای همون نقش درست کنیم و قابلیت‌های اختصاصی رو توی اون کلاس جدا تعریف کنیم. برای این کار، ارث‌بری به کار ما میاد.برای اینکه یک کلاس رو توسعه بدیم، یک کلاس جدید می‌سازیم و از کلمه‌کلیدی extends به صورت زیر استفاده می‌کنیم:class User { }

class WriterUser extends User {

}توی این مثال، کلاس User به عنوان کلاس والد (Parent) و کلاس WriterUser به عنوان کلاس فرزند (Child) در نظر شناخته میشه. با این کار، کلاس فرزند همه ویژگی‌های کلاس والد رو در اختیار داره:class User {
  login() {
    alert&#40;&amp;quotLogging in...&amp;quot&#41;;
  }
}

class WriterUser extends User {

}

const david = new WriterUser();
 david.login(); // Logging in...حالا می‌تونیم کلاس WriterUser رو به صورت اختصاصی توسعه بدیم:class User {
  login() { }
  logout() { }
}

class WriterUser extends User {
  writePost() { }
  deletePost(id) { }
}

const david = new WriterUser();
david.login();
david.writePost();
david.logout();با این کار کلاس User از ویژگی‌هایی که برای اون بی‌معنی هست خالی میشه و برنامهٔ ما معنادارتر و توسعهٔ اون راحت‌تر میشه ?نکته: توی جاوااسکریپت یک کلاس حداکثر می‌تونه یک کلاس والد داشته باشه. همچنین کلاس والد نمی‌تونه به اعضای کلاس فرزند دسترسی داشته باشه.دسترسی به اعضای کلاس والدبا استفاده از کلمه‌کلیدی super توی یک کلاس می‌تونیم به اعضای کلاس والد دسترسی داشته باشیم:class Parent {
  parentMethod() {
    alert&#40;&amp;quotI&#039;m a method in the parent&amp;quot&#41;;
  }
}

class Child extends Parent {
  childMethod() {
     super.parentMethod();
  }
}

const obj = new Child();
obj.childMethod(); // I&#039;m a method in the parentاگه هم کلاس والد و هم کلاس فرزند constructor دارن، کلاس فرزند توی constructor خودش، باید constructor والد رو صدا بزنه. این کار با صدا زدن تابعی به اسم ()super اتفاق میوفته:class Parent {
  constructor() {
    alert&#40;&amp;quotI&#039;m a method in the parent&amp;quot&#41;;
  }
}

class Child extends Parent {
  constructor() {
     super();
  }
}

const obj = new Child(); // I&#039;m a method in the parentبه این صورت این تابع می‌تونه یک ورودی رو به constructor والد پاس بده:class User {
  constructor(name) {
    this.name = name;
  }
}

class WriterUser extends User {
  constructor(name) {
     super(name);
  }

  writePost() { }
  deletePost(id) { }
}

const david = new WriterUser(&amp;quotDavid&amp;quot);
alert&#40;david.name&#41;; // Davidاگه super رو صدا نزنیم خطا می‌گیریم. توی بعضی از زبان‌های برنامه‌نویسی ممکنه خطا نگیریم، اما این کار باعث میشه constructor والد اجرا نشه.اما کدی که نوشتیم یک کار اضافی هست. چون توی constructor فرزند هیچ کار دیگه‌ای غیر از صدا زدن constructor والد انجام ندادیم. توی چنین شرایطی بهتره از نوشتن constructor فرزند صرف نظر کنیم:class User {
  constructor(name) {
    this.name = name;
  }
}

class WriterUser extends User {
  writePost() { }
  deletePost(id) { }
}

const david = new WriterUser(&amp;quotDavid&amp;quot);
alert&#40;david.name&#41;; // Davidبا ساخته شدن نمونه از کلاس فرزند، constructor والد به طور خودکار اجرا میشه.فرزند و زیرفرزندیک کلاس که نقش فرزند رو بازی می‌کنه، می‌تونه نقش والد برای یک کلاس دیگه رو هم ایفا کنه:class A1 {
  constructor() {
    alert&#40;&amp;quotI&#039;m A1&amp;quot&#41;;
  }
}

class A2 extends A1 {
  constructor() {
    super();
    alert&#40;&amp;quotI&#039;m A2&amp;quot&#41;;
  }
}

class A3 extends A2 {
  constructor() {
    super();
    alert&#40;&amp;quotI&#039;m A3&amp;quot&#41;;
  }
}

new A3;بررسی کردن نوع آبجکتبرای اینکه ببینیم یک آبجکت از نوع یک کلاس خاص هست یا نه، از عملگر instanceof استفاده می‌کنیم. این عملگر به ما true یا false برمی‌گردونه:class User { }

const emily = new User();

alert&#40;emily instanceof User&#41;; // true
alert&#40;emily instanceof Array&#41;; // falseخب دوستان با کلاس‌ها و ویژگی‌های اونها توی ES6 جاوااسکریپت آشنا شدیم و دیدیم که با اونها ساختن آبجکت‌هایی که ویژگی‌های مشابه دارن چقدر راحت میشه!Resources:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classeshttps://dmitripavlutin.com/javascript-classes-complete-guide</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 22 Aug 2022 18:28:25 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی متد reverse در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/reverse-an-array-in-javascript-vxibvjnl1z0l</link>
                <description>متد reverse یا معکوس کردن آرایه در جاوااسکریپتآرایه در جاوااسکریپت یک متغیر منفرد است که برای ذخیره‌سازی عناصر مختلف مورد استفاده قرار می‌گیرد. کاربرد آرایه بیشتر در مواردی است که بخواهیم لیستی از عناصر را ذخیره کرده و به وسیله یک متغیر منفرد به آن‌ها دسترسی داشته باشیم. برخلاف بسیاری از زبان‌های دیگر برنامه‌نویسی که آرایه ارجاعی به چند متغیر محسوب می‌شود، در جاوااسکریپت، آرایه یک متغیر منفرد است که چند عنصر را در خود نگهداری می‌کند. در این مقاله با روش‌های مختلف معکوس کردن آرایه در جاوااسکریپت آشنا می‌شویم.متد ()reverse ترتیب عناصر یک آرایه را معکوس می‌کند.آرایه در یک متغیر منفرد نگهداری می‌شود. در متد ()reverse.، آخرین عنصر آرایه به عنصر اول و عنصر اول به عنصر آخر تبدیل می‌شود. این متد تغییرات را روی آرایه اصلی اعمال می‌کند.دستکاری آرایه اصلی اما اگر بخواهیم آرایه اصلی دست نخورده بماند، می‌توانیم از روش‌های زیر استفاده کنیم:()reverse. با ()slice.()reverse. با ()spread.روش اول: reverse با sliceمتد ()slice. عناصر منتخب را در یک آرایه به صورت یک شیء آرایه جدید بازگشت می‌دهد.متد ()reverse. آرایه جاوااسکریپت ترتیب عناصر آرایه مفروض را تغییر داده و توالی معکوس را بازگشت می‌دهد.معکوس سازی آرایه با ()slice. روش دوم: reverse با spreadساختار ()spread. در واقع متشکل از سه نقطه پشت سرهم (…) است.ساختار اسپرد می‌تواند همه دستکاری‌های آرایه را که قبلاً نیازمند متدهای push ،concat یا slice بود، انجام دهد.معکوس کردن یک آرایه با عملگر spread منبع : medium.com</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Tue, 16 Aug 2022 18:47:23 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی متد های splice , slice و split در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/slice-splice-split-methods-in-js-own3osjmjurd</link>
                <description>متدهای داخلی جاوااسکریپت، زمانی که به درستی آن‌ها را بشناسیم، کمک زیادی در زمان برنامه‌نویسی به ما می‌کنند. در این نوشته به توضیح سه مورد از این متدها یعنی ()splice()، slice و ()split می‌پردازیم. اکثر برنامه‌نویسان حتی خبره نیز، احتمالاً به دلیل نام‌گذاری شبیه به هم، گاهی اوقات آن‌ها را با هم اشتباه می‌گیرند. به دانشجویان و برنامه‌نویس‌های تازه‌کار پیشنهاد می‌شود این مقاله را به دقت بخوانند، چون امکان دارد در مصاحبه‌های شغلی در مورد تفاوت این متدها از شما سؤال شود. خلاصه‌ای از هر متد در انتهای این مقاله ارائه شده است.آرایه‌های جاوااسکریپتدر ابتدا باید درکی از طرز کار آرایه‌های جاوااسکریپت داشته باشید. ما در جاوااسکریپت نیز همانند دیگر زبان‌های برنامه‌نویسی، از آرایه‌ها برای ذخیره‌سازی داده‌های چندگانه بهره می‌گیریم. اما تفاوت کار در این جاست که در جاوااسکریپت یک آرایه می‌تواند شامل انواع مختلفی از داده‌ها باشد.برخی اوقات لازم می‌شود که عملیاتی روی این آرایه‌ها انجام دهیم. در این موارد از برخی متدهای جاوااسکریپت مانند ()slice و ()splice استفاده می‌کنیم. در ادامه روش اعلان یک آرایه در جاوااسکریپت را مشاهده می‌کنید:let arrayDefinition = []; // Array declaration in JSدر ادامه آرایه دیگری را با انواع داده متفاوت ایجاد می‌کنیم. از این آرایه در مثال‌های خود بهره خواهیم گرفت:let array = [1, 2, 3, &amp;quothello world&amp;quot, 4.12, true];این نوع کاربرد آرایه یعنی آرایه‌ای با انواع داده متفاوت شامل رشته، عدد و متغیرهای بولی، در جاوااسکریپت معتبر است.متد ()Sliceمتد ()Slice بخش مفروضی از یک آرایه را کپی کرده و این بخش کپی شده را در یک ارائه جدید باز می‌گرداند. این متد تغییری در آرایه اولیه ایجاد نمی‌کند.array.slice(from, until);این متد دو پارامتر دارد:From: بخشی که آرایه جدید آغاز می‌شود را تعیین می‌کند.Until: بخش انتهایی که آرایه جدید در آن پایان می‌یابد را مشخص می‌سازد.برای نمونه اگر بخواهیم سه عنصر اولیه آرایه فوق را بازگردانیم، از آنجا که عنصر اولیه آرایه همیشه از اندیس 0 آغاز می‌شود باید مقدار from را برابر با 0 در نظر بگیریم.برای نمونه اگر بخواهیم سه عنصر اولیه آرایه فوق را بازگردانیم، از آنجا که عنصر اولیه آرایه همیشه از اندیس 0 آغاز می‌شود باید مقدار from را برابر با 0 در نظر بگیریم.array.slice(0, until);اینک به بخشی می‌رسیم که شاید کمی گیج‌کننده باشد. وقتی می‌خواهیم سه عنصر نخست را جدا کنیم ممکن است فکر کنید باید مقدار until را برابر با 3 قرار دهیم؛ اما در این صورت با خطا مواجه می‌شویم چون عنصر اندیس 3 در این آرایه وجود ندارد.array[0] --&gt; 1// included

array[1] --&gt; 2// included

array[2] --&gt; 3// included

array[3] --&gt; &amp;quothello world&amp;quot// not includedاین وضعیت موجب سردرگمی می‌شود. به همین دلیل است که پارامتر دوم Until (به معنی «تا اینجا») نام‌گذاری شده است.let newArray = array.slice(0, 3);// Return value is also an arrayدر نهایت آرایه جدا شده را به متغیر newArray انتساب می‌دهیم. نتیجه را در تصویر زیر مشاهده می‌کنید:let array = [1, 2, 3, &amp;quothello world&amp;quot, 4.12, true];
let newArray = array.slice(0, 3); // [1,2,3]آرایه جدا شده و به متغیر newArray انتساب یافته است.متغیر newArray اینک یک آرایه است و آرایه اولیه نیز به شکل اصلی خود باقی است.نکته مهم: متد ()slice روی رشته‌ها نیز قابل استفاده است.متد ()Spliceنام این تابع کاملاً شبیه ()slice است. این شباهت نام در اغلب موارد موجب سردرگمی توسعه‌دهندگان می‌شود. متد ()splice یک آرایه را با افزودن یا حذف عناصر آن تغییر می‌دهد. در ادامه روش حذف یا اضافه کردن عناصر با استفاده از ()splice را بررسی می‌کنیم.حذف عناصربرای حذف کردن عناصر یک آرایه باید پارامتر index و تعداد عناصری که باید حذف شوند را تعیین کنیم:array.splice(index, number of elements);index نقطه آغاز حذف عناصر مفروض از آرایه است. عناصری که اندیسی کمتر از index دارند از آرایه حذف نمی‌شوند:array.splice(2);// Every element starting from index 2, will be removedاگر پارامتر دوم تعیین نشود همه عناصر بزرگ‌تر از index در آرایه حذف خواهند شد:let array = [1, 2, 3, &amp;quothello world&amp;quot, 4.12, true]; 
let newArray = array.splice(2); // [3, &amp;quothello world&amp;quot, 4.12, true]
console.log(array); // [1,2]تنها اندیس‌های 0 و 1 در آرایه باقی می‌مانند.در مثال دوم، پارامتر دوم را برابر 1 قرار می‌دهیم و از این رو عناصر بالاتر از اندیس 2 با هر فراخوانی splice به تعداد 1 عدد حذف می‌شود:let array = [1, 2, 3, &amp;quothello world&amp;quot, 4.12, true]; 
array.splice(2, 1);آرایه در آغازپس از فراخوانی اول:let array = [1, 2 , &amp;quothello world&amp;quot, 4.12, true];مقدار 3 از آرایه حذف می‌شود و بنابراین «hello world» اینک اندیس 2 را یافته است.پس از فراخوانی دوم:let array = [1, 2 , 4.12, true];این بار «hello world» به عنوان اندیس 2 آرایه حذف شده است.این وضعت تا زمانی که همه اندیس‌های بالاتر از 2 حذف شوند، قابل ادامه است.افزودن عناصربرای افزودن عناصر، باید آن‌ها را در پارامترهای سوم، چهارم و غیره تابع ()splice ذکر کنیم:array.splice(index, number of elements, element, element);به عنوان نمونه فرض کنید می‌خواهیم a و b را در ابتدای آرایه اضافه کنیم و چیزی را نیز حذف نکنیم:let array = [1, 2, 3, &amp;quothello world&amp;quot, 4.12, true];
array.splice(0, 0, &#039;a&#039;, &#039;b&#039;); // [&amp;quota&amp;quot,&amp;quotb&amp;quot,1, 2, 3, &amp;quothello world&amp;quot, 4.12, true]a و b به ابتدای آرایه اضافه شدند و هیچ عنصری نیز حذف نشده است.متد ()Splitمتدهای ()Slice و ()splice برای آرایه‌ها استفاده می‌شوند. متد ()Split در مورد رشته‌ها کاربرد دارد. این متد یک رشته را به زیررشته‌هایی تقسیم کرده و آن‌ها را به صورت یک آرایه بازگشت می‌دهد. این متد دو پارامتر می‌گیرد که هر دو اختیاری هستند.string.split(separator, limit);separator: روش تقسیم رشته را تعیین می‌کند، مثلاً بر اساس کاما، یک کاراکتر خاص یا موارد دیگر.Limit: تعداد اِفرازها را بر اساس یک عدد مشخص محدود می‌سازد.متد ()Split به طور مستقیم روی آرایه‌ها کار نمی‌کند. با این حال می‌توانیم ابتدا عناصر آرایه را به یک رشته تبدیل کنیم و سپس از متد ()split رویان استفاده کنیم. در ادامه طرز کار این روش را نشان می‌دهیم.ابتدا با متد ()toString آرایه خود را به یک رشته تبدیل می‌کنیم:let myString = array.toString();اینک myString را بر اساس کاما ها تقسیم می‌کنیم و تعداد آن‌ها را هم به 3 زیررشته محدود می‌سازیم و آن‌ها را به صورت یک آرایه باز می‌گردانیم:let newArray = myString.split(&amp;quot,&amp;quot, 3);تنها 3 عنصر اول بازگشت می‌یابند. همان طور که می‌بینیم myString بر اساس کاماها تقسیم شده است. از آنجا که تعداد افراز را محدود به 3 عدد کرده این تنها 3 عنصر نخست بازگشت می‌یابند.نکته: اگر از این تابع به صورت ;(“”)array.split استفاده کنیم، در این صورت هر کاراکتر رشته به صورت یک زیررشته تقسیم می‌شود:هر کاراکتر به صورت یک به یک، به صورت رشته مستقلی افراز می‌شود. جمع‌بندیدر ادامه جمع‌بندی از متدهایی که در بالا از آن‌ها صحبت شد ارائه شده است.()Sliceعناصری را از یک آرایه کپی می‌کند.این عناصر را به صورت یک آرایه جدید بازمی گرداند.آرایه اصلی تغییری نمی‌یابد.محل شروع جداسازی آرایه جدید از پارامتر اول تابع (from) و تا پارامتر دوم (until) است.Slice خود اندیس until را شامل نمی‌شود.این متد هم برای آرایه‌ها و هم رشته‌ها کاربرد دارد.()Spliceبرای افزودن/حذف عناصر از آرایه استفاده می‌شود.یک آرایه از عناصر حذف شده باز می‌گرداند.آرایه اصلی را تغییر می‌دهد.برای افزودن عناصر به صورت (array.splice (index, number of elements, element استفاده می‌شود.برای حذف عناصر به صورت (array.splice (index, number of elements استفاده می‌شود.تنها برای آرایه‌ها می‌تواند استفاده شود.()Splitیک رشته را به زیررشته‌هایی تقسیم می‌کند.آن‌ها را در یک آرایه باز می‌گرداند.دو پارامتر می‌گیرد که هر دو اختیاری هستند: (string.split(separator, limitرشته اصلی را تغییر نمی‌دهد.تنها در مورد رشته‌ها قابل استفاده است.دقت کنید که متدهای داخلی زیادی در جاوا اسکریپت برای کار با آرایه‌ها و رشته‌ها وجود دارند. با یادگیری طرز کار این متدها، فرایند برنامه‌نویسی شما بسیار ساده‌تر می‌شود.منبع : freecodecamp.org</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Tue, 16 Aug 2022 15:44:18 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی توابع کلوژر (Closure) در جاوااسکریپت</title>
                <link>https://virgool.io/Solidity/what-is-closure-in-js-gu90e26llse6</link>
                <description>سلام دوستان. یک موضوع مهم و کاربردی توی جاوا اسکریپت وجود داره و معمولاً توی مصاحبه‌ها هم پرسیده میشه کلوژر یا Closure هست که امروز مفصل با اون آشنا می‌شیم.کلوژر چیه؟ ?کلوژر (Closure) چیزی نیست جز یک تابع معمولی که داخل یک تابع دیگه تعریف و return میشه:function outer() {
  return function inner() {

  }
}توی این کد تابع inner یک کلوژر هست و به این صورت استفاده میشه:function outer() {
  return function inner() {
    alert&#40;&amp;quotHi&amp;quot&#41;;
  }
}

const x = outer();
x(); //Hiتوی خط ۷ تابع outer رو اجرا کردیم و خروجی اون که تابع inner هست رو ریختیم توی متغیر x. پس الان مقدار متغیر x یک تابع هست و باید مثل یک تابع فراخونی بشه. مثل خط ۸.اما خب تعریف کردن یک تابع داخل یک تابع دیگه چه مزایایی داره؟ کلوژر دو مشکل رو حل می‌کنه:۱. پایداری اطلاعات۲. امنیت اطلاعات۱. پایداری اطلاعات یعنی چی؟ ?کد زیر رو در نظر بگیرین. فرض کنیم یک تابع داریم که تعداد کلیک‌ها رو می‌خواد بشماره:function clicked() {
  let counter = 0;
  counter++;

  return counter;
}

alert&#40;clicked(&#41;); // 1
alert&#40;clicked(&#41;); // 1
alert&#40;clicked(&#41;); // 1ما توی خط‌های آخر ۳ بار این تابع رو اجرا کردیم و انتظار داریم شمارنده عدد 3 رو به ما نشون بده. اما با اجرای این کد می‌بینیم که شمارنده ۳ بار عدد 1 رو نشون داد. چرا؟⚠ با تموم شدن کار یک تابع، متغیرهایی که توی توابع وجود دارن هم از بین میرن. همچنین هر بار که تابع رو صدا می‌زنیم، متغیرهایی فقط مخصوص همون فراخونی ساخته میشن.اینجا به محض اینکه تابع clicked فراخونی میشه، یک متغیر counter مخصوص همون فراخونی تولید میشه و به محض تموم شدن کار تابع، اون متغیر از بین میره.توی فراخونی اول (خط ۸) یک counter اختصاصی تولید شد و وقتی کار تابع به پایان رسید از بین رفت. همین قضیه برای فراخونی‌های خط ۹ و ۱۰ هم صدق می‌کنه. این یعنی متغیر counter پایدار نیست.ادامه رو بخونید. شاید این کار رو بتونیم با ساختن متغیرهای سراسری حل کنیم!۲. امنیت اطلاعات یعنی چی؟ ?حالا کد زیر رو در نظر بگیرید. متغیر counter رو بیرون و توی گلوبال اسکوپ تعریف کردیم:let counter = 0;

function clicked() {
  counter++;
}

clicked();
clicked();
clicked();

alert&#40;counter&#41;; // 3همونطور که می‌دونیم متغیرهایی که توی گلوبال اسکوپ تعریف میشن، از زمان شروع اجرای برنامه تا آخر، زنده و توسط همه اسکوپ‌های داخلی قابل دسترسی هستن. توی این کد، هر بار که تابع clicked اجرا بشه، مقدار متغیر counter تغییر می‌کنه و خروجی مد نظر ما برامون نمایش داده میشه.تا اینجا همه چیز خوب پیش میره. حالا می‌خوایم یک تابع دیگه بسازیم که تعداد دابل‌کلیک‌ها رو می‌شماره:let counter = 0;

function clicked() {
  counter++;
}

function dblClicked() {
  counter++;
}

clicked();
clicked();
clicked();

dblClicked();
dblClicked();

alert&#40;counter&#41;; // 5تابع dblClicked هم (بدون اینکه از این نکته آگاه باشه که یک تابع دیگه داره از counter استفاده می‌کنه) وابسته به متغیر counter هست. یعنی تغییری که تابع clicked به counter میده، روی خروجی تابع dblClicked هم تأثیر می‌ذاره! ما ۳ بار تابع clicked رو صدا زدیم و انتظار داریم که مقدار counter عدد 3 باشه. اما 5 هست!متغیر counter به دلیل اینکه تو بیرونی‌ترین قسمت برنامه تعریف شده، از همه جای برنامه قابل دسترسی و تغییر هست و بنابراین نمی‌تونه شامل مقدار قابل اعتمادی باشه. یعنی هر قسمتی از برنامه (مثل دو تابع بالا) هر وقت که دلشون بخواد می‌تونن مقدار این متغیر رو تغییر بدن. این یعنی متغیر counter امن و قابل اتکاء نیست.پس راه حل چیه؟ چطوری می‌تونیم متغیرهایی داشته باشیم که هم امن هستن و هم پایدار؟ جواب استفاده از کلوژرهاست ?و اما دوباره به این پرسش میرسیم که کلوژر چیه؟ ?همونطور که گفتیم کلوژر تابعی هست که توی یک تابع دیگه تعریف و return میشه:function outer() {
  const msg = &amp;quotHello&amp;quot

  return function inner() {

  }
}اینجا inner یک تابع داخلی هست که به اون می‌گیم کلوژر. خاصیت توابع داخلی اینه که می‌تونن به اعضای تابع بیرونی دسترسی داشته باشن. اینجا تابع inner به متغیر تابع بیرونی یعنی msg دسترسی داره. خب این به چه دردی می‌خوره؟ بالاتر گفتیم که وقتی کار یک تابع به پایان می‌رسه، اعضای اون هم از بین میرن. اما این اعضا برای کلوژر همچنان قابل دسترس هست! به بیان ساده‌تر، تابع بیرونی هنگام خداحافظی، میراث خودش رو برای تابع داخلی به جا می‌ذاره و تابع داخلی می‌تونه راهِ تابع بیرونی رو ادامه بده:function outer() {
  const msg = &amp;quotHello&amp;quot

  return function inner() {
    alert&#40;msg&#41;;
  }
}

const show = outer();

show(); // Hello
show(); // Helloاینجا توی خط ۹ تابع outer اجرا شد و قبل از خداحافظی تابعی رو return کرد. الان مقدار متغیر show همون تابع inner هست. هر بار که show رو مثل یک تابع صدا می‌زنیم، می‌بینیم که Hello برای ما نمایش داده میشه. پس متغیر msg هنوز زنده هست با این نکته که کار تابع outer قبلاً به پایان رسیده!گفتیم که متغیر msg هنوز زنده هست. اما به دلیل اینکه داخل تابع تعریف شده، از بیرون قابل دسترسی نیست:function outer() {
  const msg = &amp;quotHello&amp;quot

  return function inner() {
    alert&#40;msg&#41;;
  }
}

const show = outer();

show(); // Hello
alert&#40;msg&#41;; // Error: msg is not definedپس متغیر msg هم پایداری داره و هم امنیت ?بیاین مثال شمارنده رو با کلوژرها بنویسیم:function makeCounter() {
  let counter = 0;
 
  return function () {
    return ++counter;
  }
}

const clicked = makeCounter();

alert&#40;clicked(&#41;); // 1
alert&#40;clicked(&#41;); // 2
alert&#40;clicked(&#41;); // 3همونطور که می‌بینیم با هر بار فراخونی تابع clicked یک واحد به counter اضافه شد و در نتیجه 1 و 2 و 3 به ما نمایش داده میشه. متغیر counter فقط برای تابع (متغیر) clicked ساخته شده و همچنین از بیرون قابل تغییر نیست. یعنی فقط و فقط تابع clicked می‌تونه مقدار اون رو تغییر بده.با هر بار فراخونی تابع makeCounter، یک متغیر counter و یک کلوژر اختصاصی درست میشه. پس با این کد خیلی راحت می‌تونیم یک شمارنده دیگه درست کنیم:function makeCounter() {
  let counter = 0;
 
  return function () {
    return ++counter;
  }
}

const clicked = makeCounter();
alert&#40;clicked(&#41;); // 1
alert&#40;clicked(&#41;); // 2

 const dblClicked = makeCounter();
alert&#40;dblClicked(&#41;); // 1
alert&#40;dblClicked(&#41;); // 2توی خط ۱۳ یک شمارنده دیگه ساختیم. با اجرای این کد همونطور که می‌بینیم هر دو شمارنده، counter های اختصاصی خودشون رو دارن که هیچ کس جز خودشون نمی‌تونن مقدار اون رو تغییر بدن.یک مثال دیگهفرض کنیم می‌خوایم با پیام‌های مختلفی مثل Welcome و یا Hello به کاربرها خوش‌آمد بگیم:function greeting(type) {
  return function (user) {
    alert&#40;`${type} ${user}! This is our application.`&#41;;
  }
}

const welcome = greeting(&#039;Welcome&#039;);
welcome(&#039;Mario&#039;); // Welcome Mario! This is our application.
welcome(&#039;Emily&#039;); // Welcome Emily! This is our application.

const hello = greeting(&#039;Hello&#039;);
hello(&#039;Mario&#039;); // Hello Mario! This is our application.
hello(&#039;Emily&#039;); // Hello Emily! This is our application.خب دوستان با کلوژر آشنا شدیم و دیدیم که می‌تونیم با اون پایداری و امنیت اطلاعات داشته باشیم. هر وقت نیاز به اطلاعاتی پایدار داشتین اما موضوع امنیت اطلاعات مطرح بود، می‌تونین از کلوژرها استفاده کنین ??</description>
                <category>Hossein Shahmohammadi</category>
                <author>Hossein Shahmohammadi</author>
                <pubDate>Mon, 15 Aug 2022 22:06:59 +0430</pubDate>
            </item>
            </channel>
</rss>