<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali Abbasifard</title>
        <link>https://virgool.io/feed/@aliabbasifard</link>
        <description>ASP.NET Developer at Okala</description>
        <language>fa</language>
        <pubDate>2026-06-16 16:29:51</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/86886/avatar/4WvzoC.jpg?height=120&amp;width=120</url>
            <title>Ali Abbasifard</title>
            <link>https://virgool.io/@aliabbasifard</link>
        </image>

                    <item>
                <title>آشنایی با خرگوش - RabbitMQ</title>
                <link>https://virgool.io/@aliabbasifard/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%AE%D8%B1%DA%AF%D9%88%D8%B4-rabbitmq-hh4uquogzw0s</link>
                <description>یک Big Pictureمطلب را با یک تصویر کلی از RabbitMQ آغاز می‌کنیم. RabbitMQ ابزاری است که از آن برای انتقال اطلاعات بین چندین سیستم مجزا استفاده می‌شود. مثلا فرض کنید می‌خواهیم ایمیل افراد مختلف را از سایتی دریافت کرده و به آن‌ها ایمیل بزنیم. حالا یا این فرآیند را در یک برنامه انجام می‌دهیم و یا از دو برنامه جدا که هر یک وظیفه خاصی دارند استفاده می‌کنیم. این مقاله درباره روش دوم است.مثلا برنامه زرد رنگ ایمیل‌ها را از وب دریافت کرده و به ‌RabbitMQ می‌فرستد. برنامه دوم هم آدرس‌ها را گرفته و به آن‌ها ایمیل ارسال می‌کند. با این کار دیگر لازم نیست نگران چفت شدگی منطق‌های دو برنامه باهم باشیم. برنامه‌ها منطق خود را دارند و به راحتی کنار هم کار می‌کنند. پس هدف کلی این ابزار، ایجاد ارتباط بین سیستم‌های مختلف است.پروتکل AMQPپروتکل بایدها و نبایدهایی است که موجودیت‌های مختلف برای این که بتوانند باهم ارتباط برقرار کنند، باید آن را رعایت‌کنند. مثلا پروتکل‌های بهداشتی در ایام کرونا که بایدها و نبایدهایی بود برای این که بتوانیم در این ایام باهم تعامل کنیم یا پروتکل‌های وب که بایدها و نبایدهایی است برای تعامل در سطح شبکه.این پروتکل‌ها به خودی خود، پیاده‌سازی نیستند بلکه فقط تعریف کننده قوانین هستند. حال ابزارهای مختلف این قوانین را پیاده‌سازی می‌کنند تا در جاهای مختلف مورد استفاده قرار گیرند. Advanced Message Queuing Protocol یا به اختصار AMQP هم یکی از پروتکل‌هایی است که قوانینی را تعریف می‌کند که با رعایت آن، می‌توان بین سیستم‌های مختلف ارتباط ایجاد کرده و اطلاعات رد و بدل کرد و RabbitMQ یکی از ابزارهایی است که این پروتکل را پیاده کرده است.این پروتکل بخش‌های مختلفی دارد که سعی می‌کنیم هرکدام رو توضیح دهیم.یک دید کلی از موجودیت‌های پروتکل AMQPتولیدکننده پیام یا Producer: عضوی که وظیفه ارسال پیام را دارد. در مثال قبل، برنامه زرد، ایمیل‌ها را خزش می‌کرد و به RabbitMQ می‌فرستاد.مصرف‌کننده یا ‌Consumer: عضوی که وظیفه دریافت پیام را دارد و از آن استفاده می‌کند. در مثال قبل، برنامه آبی، ایمیل‌ها را دریافت کرده و پردازش مورد نظر خود را روی آن‌ها انجام می‌داد (نوشتن کدی برای ارسال ایمیل).مبادله‌کننده یا Exchange: عضوی که پیام‌ها را از تولید‌کننده دریافت می‌کند و به صف متناسب انتقال می‌دهد. مصرف‌کننده‌ها به این صف وصل می‌شوند نه به خود Exchange.صف یا ‌Queue: عضوی که پیام‌هارا از Exchange دریافت کرده و در خود ذخیره می‌کند تا زمانی که توسط یک مصرف‌کننده استفاده گردد.کلید مسیریابی یا Routing Key: به فرآیند ارسال پیام به Exchange و تصمیم‌گیری Exchange برای ارسال این پیام به صف درست، مسیریابی گفته می‌شود. در این مسیریابی، عنصری به اسم کلید مسیریابی دخیل است. این کلید به صورت یک متن است و به محتوای اصلی اضافه می‌شود و بعد، Exchange تصمیم می‌گیرد که بر اساس این کلید، محتوا را به کدام صف تحویل دهد.اتصال یا Binding: کلیدی که یک صف را به یک ‌Exchange وصل می‌کند.همانطور که درباره مسیریابی گفتیم، این فرآیند باعث می‌شود یک پیام به یک صف خاص یا صف‌های خاص انتقال پیدا کند. در این مسیریابی سه عنصر تاثیر بسیار زیادی دارند. Routing Key - Binding - Exchange. ما در RabbitMQ انواع مختلفی از Exchange ها را داریم که هر کدام رفتار خاصی دارند. مثلا یک نوع Exchange پیام‌های دریافتی خود را، به همه صف‌هایی که به آن Exchange وصل شده‌اند ارسال می‌کند. اما Exchange هایی هم داریم که پس از دریافت پیام، ابتدا Routing Key و Binding را بررسی کرده و بعد تصمیم به ارسال پیام به صف مناسب می‌کنند. پس این سه عنصر در فرآیند مسیریابی بسیار دخیل هستند.زبان Erlangبرای پیاده‌سازی RabbitMQ از زبان برنامه‌نویسی Erlang استفاده شده است. از این زبان برای سناریوهایی استفاده می‌شود که تمرکز زیادی روی انتقال اطلاعات از فواصل دور دارند. این سناریوها عموما از شبکه‌های مختلف از جمله شبکه تلفن‌ همراه و بی‌سیم برای انتقال اطلاعات استفاده می‌کنند. همزمانی، توزیع و مقیاس پذیری، تحمل خطا و ... از ویژگی‌های این زبان هستند که RabbitMQ از همین ویژگی‌ها برای قابلیت اطمینان ارسال پیام‌ها و سایر ویژگی‌های مورد نیاز خود استفاده می‌کند.انواع مختلف ‌Exchangeبرای نمایش انواع مختلف Exchangeها از سایتی با این آدرس https://tryrabbitmq.com استفاده شده است. بهتر است خودتان هم موارد گفته شده را تست کنید.نوع شماره 1: Direct Exchange: در این نوع اگر Routing Key با Binding Key برابر باشد، پیام به این صف انتقال می‌یابد. در مثال پایین، توپ‌های سفید پیام‌هایی هستند که Routing Key آن‌ها شامل مقدار errors است پس Exchange پس از دریافت این پیام‌ها، آن‌ها را به صفی ارسال می‌کند که با Binding Key آن‌هم مقدارش errors باشد. (صف سمت راست). دقت داشته باشید که یک صف هم در سمت چپ قرار دارد که مقدار Binding Key آن برابر log است و فقط پیام‌هایی به این صف می‌آید که مقدار Routing Key آن‌ها برابر با log باشد.نوع شماره 2: Default Exchange: در این نوع، مقدار Binding Key برابر با اسم صف است. دقت داشته باشید در حالت قبل، ما می‌توانستیم یک نام برای صف و یک مقدار متفاوت برای Binding اختصاص بدهیم ولی در این حالت هر دو یکی است. نحوه ارسال پیام‌ها مانند Direct Exchange است.نوع شماره 3: Topic Exchange: در این نوع، مقدار Binding Key برابر الگویی است که همخوانی Routing Key با این الگو مشخص می‌کند که پیام به کدام صف منتقل شود. برای ساختن این الگو از دو نماد استفاده می‌شود. یکی * به معنی یک کلمه و # به معنی 0 یا بی‌نهایت کلمه. مثلا اگر ‌Binding Key برابر با *.error باشد، این یعنی همه پیام‌هایی که Routing Key آن‌ها برابر با مقادیری مثل error.ali - error.book - error.anything باشد به این صف انتقال پیدا می‌کنند یا مثلا اگر Binding Key برابر با #.error باشد، این یعنی همه پیام‌هایی که Routing Key آن‌ها برابر با مقادیری مثل error.ali.reza.hamid.book - error - error.word باشد به این صف انتقال پیدا می‌کنند.در عکس دوم ما پیامی را با Routing Key معادل با error.a ارسال کردیم. چون این Routing Key شامل        هردو الگو می‌شود پس به هردو صف وارد می‌گردد.نوع شماره 4: Fanout Exchange: در این نوع، مقدار Binding Key و Routing Key اهمیتی ندارد چرا که پیام وقتی به Exchange برسد، به همه صف‌ها انتقال می‌یابد.ویژگی‌های RabbitMQحال بیایید با تعدادی از ویژگی‌های RabbitMQ آشنا شویم.پایداری پیام یا Message Durability: این امکان در RabbitMQ وجود دارد که پیام‌ها را در دیسک ذخیره کند تا درصورت خاموش شدن ماشین یا هر اتفاق دیگری، پیام‌ها قابل بازیابی باشند. البته این قابلیت هم در پیام‌ها و هم درباره صف‌ها وجود دارد. درواقع شما می‌توانید صف‌های خود را Durable کنید تا درصورتی که Exchange به هر دلیلی از دسترس خارج شد یا ریستارت شد، صف‌ها بازیابی شوند.تایید دریافت پیام یا Message Acknowledgment: این قابلیت وجود دارد که مصرف‌کننده پیام، پس از این که پیام را دریافت کرد، یک تایید به RabbitMQ ارسال کند تا RabbitMQ از ارسال و تحویل آن به مصرف‌کننده اطمینان پیدا کند. این کار باعث می‌شود پیام گم نشود. درصورتی که ‌Exchange این تایید را دریافت نکند، پیام را از حافظه خود پاک نمی‌کند بلکه عملیات لازم برای ارسال دوباره پیام انجام می‌دهد.تایید ارسال پیام یا Publisher Confirms: مانند قابلیت قبلی است با این تفاوت که اینبار Exchange به فرستنده تاییدی ارسال می‌کند مبنی بر این که پیام فرسنده دریافت و ذخیره شده است. در صورتی که فرستنده این تایید را دریافت نکند می‌تواند دوباره پیام خود را ارسال کند.در دسترس بودن یا High Availability: یکی دیگر از قابلیت‌های RabbitMQ این است که می‌توان چندین Node از آن را بالا آورد و تمام این کلاستر به صورت یک سیستم فعالیت کند و درصورت خاموش شدن یک ماشین، می‌توان اطمینان داشت که Node های دیگر به کار خود ادامه می‌دهند و مانع از پایین بودن کل سیستم می‌شوند.فعالیت عملیمتاسفانه الان فرصت این رو ندارم که مثال عملی براتون بنویسم و از طرفی خود داکیومنت RabbitMQ مثال‌های خوبی داره و می‌تونید از اون‌ها استفاده کنید. با این حال شاید در آینده یه مقاله دیگه یا ویدئو ازش ساختم و براتون آپلود کردم. لطفا هر سوالی داشتید ازم بپرسید. اگر بتونم حتما جواب میدم.لینک کانال پادکست من: https://t.me/BookBriefByFard</description>
                <category>Ali Abbasifard</category>
                <author>Ali Abbasifard</author>
                <pubDate>Thu, 29 Jun 2023 14:36:25 +0330</pubDate>
            </item>
                    <item>
                <title>Encoding/Decoding, Encryption/Decryption, Hashing</title>
                <link>https://virgool.io/@aliabbasifard/encodingdecoding-encryptiondecryption-hashing-kb5oqafkkzs6</link>
                <description>احتمالاً برای شما هم پیش آمده که درباره مفاهیمی که به ظاهر شبیه به هم هستند، دچار سردرگمی شوید. در دنیای نرم‌افزار از این دست موارد کم نیستند و بسیار مهم است که تعاریف درستی از آن ها داشته باشیم تا بر اساس این تعاریف، تصمیم درستی بگیریم. در این پست، تلاش می‌کنم تا سه مورد از این مفاهیم را به زبان ساده و به همراه کد به شما آموزش دهم.شماره یک: Encoding و Decodingتبدیل فکر به صدا برای انتقالآیا تا به حال به مکالمه ما با یکدیگر دقت کرده‌اید؟ تفکر ما توسط دهان به صدا تبدیل می‌شود. صدا در فاصله بین ما و شنونده انتقال میابد و در آخر، شنونده صدای دریافتی را دوباره به مفهوم تبدیل کرده و درباره آن فکر می‌کند. این فرآیند Decode و Encode است. درواقع به فرآیند تبدیل اطلاعات به فرمتی که برای انتقال و یا ذخیره‌سازی مناسب است، Encoding و به فرآیند دریافت این پیام و تبدیل آن به فرمت اولیه، Decoding گفته می‌شود. دلیل این تبدیل این است که بتوانیم اطلاعات را راحت‌تر جا‌به‌جا و یا ذخیره‌سازی کنیم چرا که فرمت اصلی اطلاعات، برای این اهداف مناسب نیست. از دیگر مثال‌های این مورد، می‌توان به تبدیل شدن دیتاهای باینری کامپیوتر به سیگنال‌های الکتریکی برای جابه‌جایی در سیم‌ها اشاره کرد.به قطعه کد زیر توجه کنید:string text = &amp;quotabc&amp;quot
byte[] bytes = Encoding.UTF8.GetBytes(text);متغییر text دارای مقدار متنی است ولی ما آن‌ را با استفاده از متد GetBytes که برای Encoding استفاده می‌شود به آرایه‌ای از بایت‌ها تبدیل کردیم. مقادیر داخل متغییر bytes به صورت زیر است:مقدار 97 برای a - مقدار 98 برای b - مقدار 99 برای cشاید از خودتان سوال کنید که این اعداد بر چه اساسی مشخص شده‌اند. چرا باید a به 97 تبدیل شود؟ برای پاسخ به این سوال لازم است نگاهی به جدول پایین بیاندازیم.encoding schemeاین جدول که به آن encoding scheme گفته می‌شود، بیان می‌کند که یک کاراکتر معادل چه مقدار بایتی در سیستم کامپیوتری می‌باشد. این جدول UTF-8 است، به این معنی که از 8 بیت برای نمایش کاراکترها استفاده می‌کند. با 8 بیت می‌توان 256 کاراکتر را نمایش داد. ما همچنین UTF-16 و UTF-32 را هم داریم که تعداد بیشتری کاراکتر را پوشش می‌دهند. طبق جدول بالا که برای UTF-8 است، کاراکتر a به عدد 97 وصل شده است. این بدان معناست که برای نمایش کاراکتر a باید آن را به صورت نمایش بایتی 97 مشخص کنیم.a : 97 : 0000000001100001حالا که متن a را به 0 و 1 ها تبدیل کردیم می‌توانیم آن را در سیم‌ها جابه‌جا کنیم. پس از این جابه‌جایی، گیرنده اطلاعات باید فرآیند Decode کردن را انجام دهد. لازم به ذکر است که برای این کار، باز هم به جدول encoding scheme نیاز است. اطلاعات باید با همان جدولی که Encode شده‌اند Decode شوند در غیر این صورت برداشت غلطی از دیتا خواهد شد. به تصویر زیر دقت کنید:بایت‌ها به حالت اولیه تبدیل شدندهمانطور که مشاهده می‌کنید، با استفاده از تابع GetString مقدار بایتی را به متن اولیه تبدیل کردیم. به این فرآیند Decode گفته می‌شود.شماره دو: Encryption و Decryptionما گاها نیاز داریم که اطلاعاتی را از نقطه‌ای به نقطه‌ای دیگر جابه‌جا کنیم اما این بار، مسئله ما نه فقط انتقال بلکه حفظ امنیت و عدم تغییر آن است. ما می‌خواهیم اطلاعات ما خوانده نشود، تغییر نکند و درست همانطور که ارسال شده، دریافت گردد. برای این منظور، از Encryption و Decryption استفاده می‌کنیم.Encryption و Decryptionدر این فرآیند، دو عنصر اساسی وجود دارد. کلید و الگوریتم. متن اولیه به همراه یک کلید، به الگوریتمی داده می‌شود و الگوریتم به وسیله آن کلید و محاسبات ریاضی، متن جدیدی به عنوان خروجی تحویل می‌دهد. طرف دریافت کننده هم با استفاده از یک الگوریتم و کلید، متن تغییر یافته را دریافت و آن را به حالت اولیه برمی‌گرداند. از آنجایی که کسی در میانه راه کلید و الگوریتم را ندارد، پس نمی‌تواند متن را خوانده و اطلاعات آن را بدست آورد. Encryption و Decryption به دو دسته تقسیم می‌گردد. Symmetric encryption و Asymmetric encryption. در Symmetric encryption از یک کلید برای Encryption و Decryption استفاده می‌شود. فرستنده و گیرنده هردو یک کلید را دارند و به همین دلیل بهتر است که خیلی مراقب این کلید بود چون در صورتی که در دست شخص دیگری باشد، امکان خواندن اطلاعات وجود دارد.در حالت دوم که Asymmetric encryption نام دارد، از دو کلید استفاده می‌گردد. یک کلید عمومی و یک کلید شخصی. کلید عمومی در دست همه قرار دارد و از آن برای encryption اطلاعات استفاده می‌شود. ارسال کننده با کلید عمومیِ شما، اطلاعات را encrypt می‌کند ولی فقط با استفاده از کلید شخصی شما می‌توان اطلاعات را Decrypt کرده و از آن استفاده کرد. درواقع این کلیدها به طریقی با هم ارتباط دارند و برای هم ساخته شده‌اند تا بتوانند تکمیل کننده کار دیگری باشند.شماره سه: Hashingدر دو مورد قبل، ما دیدیم که دیتای اولیه به حالتی دیگر تبدیل می‌شد ولی ما این قابلیت را داشتیم که اطلاعات را از حالت تبدیل شده، به حالت اول برگردانیم. درواقع همه موارد قبل، دو طرفه بودند. اما اگر بخواهیم که این فرآیند یک طرفه باشد چه؟ یعنی نخواهیم دیتای تبدیل شده، به حالت اولیه برگردد. در این صورت باید از Hashing استفاده کنیم. ابتدا به توضیح کاملتر Hashing می‌پردازیم و بعد توضیح می‌دهیم که در چه مواردی به یک طرفه بودن فرآیند نیاز داریم.در فرآیند Hashing ما اطلاعات را به وسیله الگوریتم Hash به رشته‌ای به طول ثابت تبدیل می‌کنیم. اصلا مهم نیست که اندازه ورودی شما چقدر باشد. خروجی همیشه طول یکسان خواهد داشت. این تبدیل همانطور که گفته شد، یک طرفه است و شما نمی‌توانید دیتای اولیه را بازیابی کنید. از Hashing می‌توان برای صحت‌سنجی دیتا استفاده کرد. می‌توانیم مقدار Hash یک دیتا را بگیریم و آن را با مقدار Hash قبلی همان دیتا مقایسه کنیم. درصورتی که این دو مقدار باهم متفاوت باشند، یعنی داده ما دچار تغییر شده چرا که Hash یک داده، همیشه یکسان است. مثلا در نرم‌افزارهای وب، رمز عبور کاربران به صورت Hash شده ذخیره می‌گردد. این بدان جهت است که هم رمز عبورها قابل مشاهده و بازیابی نباشد و هم این که اصلا نیازی به ذخیره واقعی آن‌ها نیست. به عنوان مثال، وقتی کاربر نام کاربری و رمز عبور خود را در فرم ورود وارد می‌کند، رمز وارد شده به تابع ‌Hash داده ‌می‌شود. در صورتی که مقدار این Hash با مقدار موجود در دیتابیس متفاوت باشد، یعنی کاربر رمز عبور خود را به درستی وارد نکرده است چرا که باید Hash های یکسانی تولید می‌شد.لینک کانال پادکست من: https://t.me/BookBriefByFard</description>
                <category>Ali Abbasifard</category>
                <author>Ali Abbasifard</author>
                <pubDate>Sun, 28 May 2023 21:48:34 +0330</pubDate>
            </item>
                    <item>
                <title>ساختن عادت برای زندگی بهتر</title>
                <link>https://virgool.io/@aliabbasifard/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D8%B9%D8%A7%D8%AF%D8%AA-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B2%D9%86%D8%AF%DA%AF%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1-uzefr3jvm4nr</link>
                <description>مقدمه: انسانی که قدم زدن را دوست دارد، از کسی که به مقصد فکر‌ می‌کند، بیشتر پیش می‌رود.احتمالاً تا الان مجسمه انسان خودساخته از هنرمند آمریکایی، آقای بابی کارلایل را دیده باشید. مجسمه مردی که خودش را از سنگ بیرون می‌کشد یا بهتر بگوییم، سعی در ساخت خودش دارد تا به فرم بهتری تبدیل شود. فکر می‌کنم این بهترین سازه بشری برای نمایش این مفهوم است که، انسان می‌تواند خودش را به چیزی که مایل است، تغییر دهد.اگر به این مجسمه دقت کنیم، می‌توانیم نکاتی را از آن بیرون بکشیم. مثلا رشد درد دارد و بسیار زمان‌بر است یا این که رشد و بهبود به مداومت و استقامت احتیاج دارد و شما نمی‌توانید بدون صبر و پرداخت هزینه، به چیزی که می‌خواهید تبدیل شوید.عادت چیست؟عادت به رفتاری گفته می‌شود که از طریق تکرار و تقویت شکل می‌گیرد، به مرور زمان در ما ریشه می‌کند و ما آن‌ را به صورت ناخواگاه انجام می‌دهیم. عادت‌ می‌تواند مفید و یا مضر بوده و نقش اساسی در کیفیت زندگی و بهره‌وری ما ایجاد کند. جالب است بدانیم، عادت‌ها حدود 40 درصد از رفتارهای روزانه ما را تشکیل می‌دهند.چرا عادت؟نکته شگفت‌انگیزی که در بحث عادت‌ها وجود دارد این است که شما به مرور هزینه کمتری بابت انجام یک فعالیت پرداخت می‌کنید چون آن فعالیت بخش جدا نشدنی زندگی شما شده است و شما به صورت اتوماتیک و ماشین‌وار آن فعالیت را انجام می‌دهید. از طرفی تکرار آن فعالیت، مهارت شما را در انجام آن کار افزایش می‌دهد. به زبان ساده‌تر، شما در بلند مدت، با صرف هزینه کمتر سود بسیار بیشتری خواهید برد.انگیزه کافی نیست!!!این نکته را همیشه آویزه گوش خود کنید. انگیزه به هیچ عنوان کافی نیست و یا شاید می‌توان گفت که انگیزه دشمن عادت است. دلیل این موضوع این است که انگیزه موقتی است و شما نباید به یک منبع موقت برای هل دادن رو به جلوی خودتان تکیه کنید. شما ممکن است روزی انگیزه نداشته باشید، عصبی باشید، خسته باشید و یا هرچیز دیگری. در این صورت تصمیمتان این خواهد بود که آن روز عادت‌های خود را پیگیری نکنید و این زنگ خطری برای پروسه ایجاد عادت است. عادت‌ها به مداومت نیاز دارند و باید تا آنجا که امکان دارد منبع ایجاد آن‌ها عاری از هر چیز موقتی مثل انگیزه باشد.نحوه ایجاد عادت:قدم اول: با یک چیز بسیار بسیار کوچک شروع کنید. به قدری کوچک که نتوانید به آن نه بگویید.همانطور که گفته شد، ما هر روز دچار نوسانات انگیزشی هستیم. حال ما یک روز خوب و یک روز بد است و به احتمال زیاد، نمی‌شود برای آن کاری کرد اما می‌شود اولین قدم را به قدری کوچک باشد که انجام ندادن آن برای ما غیر ممکن باشد. مثلا، اگر می‌خواهیم به عادت روزی صد شنا برسیم، بهتر است از روزی سه شنا شروع کنیم. اگر می‌خواهیم به عادت روزی پنج کیلومتر پیاده روی برسیم، بهتر است از روزی صد قدم شروع کنیم. توجه داشته باشید که اولین قدم، از فردی با فرد دیگر متفاوت است. برای یک شخص، روزی یک کیلومتر و برای فردی دیگر روزی ده قدم، اولین قدم است پس اندازه مهم نیست بلکه این مهم است که آن عادت طوری باشد که بتوان همیشه آن را انجام داد. این کار یک رشته مغزی برای ما ایجاد می‌کند که به مرور این رشته قوی و قوی‌تر شده و بعد از ممارست‌های مداوم، عادت مطلوب ساخته می‌شود.قدم دوم: قدم‌های کوچک بردارید.هیچ عجله‌ای نکنید. این شاید یکی از قسمت‌های سخت این فرآیند باشد. جلوی وسوسه شدن برای قدم‌های بزرگ را بگیرید. فرآیند ساخت عادت، یک فرآیند زمان‌بر، پرهزینه ولی بسیار نتیجه‌بخش است. به هیچ عنوان از روزی ده قدم پیاده روی به روزی دویست قدم جهش نکنید چرا که به احتمال زیاد، عدم توانایی شما در انجام این کار باعث سرخوردگی شما شده و شما دیگر ادامه نخواهید داد. هرچقدر که میزان کنترل شما روی کوچک بودن قدم‌ها و مداومت بیشتر باشد، شانس موفقیت شما بیشتر است.قدم سوم: خودتان را بابت انجام ندادن تمرین‌ها ملامت نکنید بلکه خود را بخشیده و دوباره ادامه دهید.اگر طی فرآیند ساخت عادت چند روز را از دست دادید هیچ اشکالی ندارد. در واقع این کاملا طبیعی و عادی است. ذهنیت همه یا هیچ را کنار بگذارید. به عنوان مثال اگر طی سی روز، فقط ده روز بتوانید عادتی را انجام دهید، کاملا عادی و نرمال است. به خودتان یادآوری کنید که شما فعلا در اول مسیر هستید. برای سی روز دوم اگر بتوانید پانزده روز را انجام دهید، بسیار فوق‌العاده است چرا که نسبت به ماه قبل پیشرفت کرده‌اید. البته یکی از کارهای خوبی که می‌توانید انجام بدهید یافتن علت انجام ندادن عادت در روزهای دیگر است. اگر بتوانید دلایل عدم انجام را پیدا کرده و آن ها را رفع کنید، بسیار نتیجه بهتری خواهید گرفت. درکل، نیمه پر لیوان را ببینید، خود را بخشیده و سریع به فرآیند برگردید.سخن پایانی: این مطمئن‌ترین راه برای بهتر شدن است. پس هرچه سریع‌تر، شروع کنید...لینک کانال پادکست من: https://t.me/BookBriefByFard</description>
                <category>Ali Abbasifard</category>
                <author>Ali Abbasifard</author>
                <pubDate>Fri, 26 May 2023 01:39:48 +0330</pubDate>
            </item>
            </channel>
</rss>