<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های رضا بزرگی</title>
        <link>https://virgool.io/feed/@rezab</link>
        <description>مهندس نرم‌افزار و توسعه‌دهنده وب؛ تکنولوژی و هنر دو عنصر حیاتی زندگیم هستند</description>
        <language>fa</language>
        <pubDate>2026-06-16 09:06:41</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/5595/avatar/7RKIsb.jpeg?height=120&amp;width=120</url>
            <title>رضا بزرگی</title>
            <link>https://virgool.io/@rezab</link>
        </image>

                    <item>
                <title>چرا TDD و تست‌محوری؟ - قسمت دوم</title>
                <link>https://virgool.io/@rezab/tdd2-yeodzqqoa9dh</link>
                <description>مقدمهدر ادامه‌ی مقاله‌ی قبلی که در خصوص چیستی TDD، ادعای رایج پیرامون آن و نکاتی چند پیرامون سرعت و کیفیت و تست‌های خودکار در CI صحبت شد، در این مقاله قصد دارم به مشکلاتی که TDD میتواند حل کند بپردازم و به این نکته اشاره‌کنم که TDD در نهایت، یک سیلور بولت نیست. در آخر، بحث را در خصوص سنجه‌های اندازه‌گیری موفقیت در TDD و معرفی شاخص‌های کمی و کیفی آن تکمیل خواهم کرد.مشکلاتی که TDD می‌تواند حل کندروش TDD در چهار بعد میتونه موثر نشان داده شود: کیفیت داخلی کد / کیفیت خارجی کد / کیفیت تست / بهره‌وریمشکلاتی که در کیفیت داخلی معمولا پیش می‌آید:۱- شلختگی در کد ۲- وجود افراد کلیدی ۳- آنبوردینگ سخت ۴- رشد پیچده ۵- تاخیر بابت عدم فهم کدمشکلاتی که در کیفیت بیرونی معمولا پیش می‌آید:۱- تعداد زیاد ثبت Bugها ۲- ریپورت‌های فراوان مشکلات ۳- فرصت کافی نداشتن دولوپر برای توسعه جدید ۴- regression (پسرفت) انجام کاری و مشکل‌دار بودن مجدد آنکیفیت تست و بهره‌وریبه کمک TDD کیفیت درونی و بیرونی کد(بهبود مشکلات فوق) افزایش خواهد یافت. تعداد خطای کمتر و فیکس سریعتر خطاهای احتمالی در کنار سرعت بیشتر تیم را شاهد خواهیم بود. همچنین افزایش‌دهنده‌ی مسئولیت و حس تعلق دولوپر جهت نوشتن تست‌های دقیق‌تر و پاس کردن آنها و در مجموع با نوشتن کدها و تست‌های باکیفیت‌تر منجر به افزایش بهره‌وری خواهیم شد.مشکلاتی که TDD نمی‌تواند حل کندتی‌دی‌دی یا TDD در نهایت یک silver bullet یا علاج قطعی دردی نیست.با TDD به همه‌ی جنبه‌های سرعت، ارزانی و کیفیت در همه‌ی سناریوها نخواهیم رسید. اگر نگاه کوتاه‌مدت به بهره‌وری سریع یا speed to market داریم و اولویت‌مون اینه‌که میخاهیم برای عقب‌نموندن در بازار، زودهنگام ریلیز داشته باشیم، و قصد داریم بست‌پرکتیس‌هایی نظیر TDD را فدا کنیم، باید مراقب آن بود. و در فرصت مقتضی به آن رو آورد.بنابراین همانطور که در مقاله‌ی قبل در خصوص نتایج تحقیقات اثربخشی TDD در سازمان‌ها صحبت شد، TDD برای کوتاه‌مدت انتخاب ناکارآمدی است.استفاده از TDD در کوتاه مدت کاهنده و در درازمدت افزاینده بهره‌وری خواهد بود. شروع با TDD و اندازه‌گیری موفقیت آنشناسایی انگیزه‌ها برای استفاده از TDD و درآوردن شاخصه‌هایی برای اندازه‌گیری آنها و البته دادن زمان کافی برای نشستن نتایج در عمل هم اهمیت زیادی دارد.برای شاخص‌ quantitativeها (کمی‌ها) از flow metricsهایی نظیر Cycle time/Number of Release یا Time spent on bugs استفاده کرد و از Code Coverage پرهیز کرد که مقیاس بسیار غیردقیقی است.مفهوم code coverage اینست که چقدر کدهامون تحت نظارت یونیت‌تست‌ها هستند.از بعد Qualitative‌ها (کیفی) میشود به Team happiness/Team communication/Sense of ownership رسید.نکته‌ی مهم اینکه از بکارگیری تعداد زیادی شاخص پرهیز کنیم.نتیجه‌گیریبا توجه به مطالب ارائه‌شده استفاده از TDD مانند استفاده از هر الگو و بهترین‌روشی بایستی آگاهانه و در جای صحیح خود باشد و قطعا استفاده از آن نسخه‌ی واحدی برای هر شرایطی نیست. تجربه‌ی شما در استفاده از TDD چه بوده است؟ </description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Fri, 22 Oct 2021 19:34:56 +0330</pubDate>
            </item>
                    <item>
                <title>چرا TDD و تست‌محوری؟ - قسمت اول</title>
                <link>https://virgool.io/@rezab/tdd-tkwpw5vkbbgt</link>
                <description>مقدمهدر این مقاله دوقسمتی به اینکه TDD (Test-driven development) چیست نگاهی می‌اندازم و از مساله‌ی همیشگی سرعت یا کیفیت حرف میزنم. از ادعاهای رایج و نتایج تحقیقات در خصوص TDD گفتم و در نهایت مورد تست اتوماتیک در CI پایپ‌لاین بررسی کردم.سرعت یا کیفیت؟ مساله این استارائه یک محصول کم‌خطا و سریع به مشتری نیاز به وجود توامان سرعت و کیفیت است.رابرت مارتین میگه تنها راهی که میشه سریع بود، اینه‌که با کیفیت بری. در واقع با کاستن خطاها، بهره‌وری بالاتر میرود که نتیجه‌ی آن افزایش کیفیت است.The only way to go fast is to go well.چیست TDD؟تی‌دی‌دی نه کاری به تکنولوژی داره و نه حتی به مساله. یک مهارته از فکر کردن به مساله‌ای که در حال حل آن هستید قبل از اینکه اونو واقعا حلش کنید. بنابراین زمان کافی خواهیم داشت که به مساله‌ی واقعی فکر کنیم.توسعه‌های کوتاه است که با چند قدم قرمز - سبز - ری‌فکتور تکرار میشود.قرمز: برای کاری که انتخاب کردیم و سیستم باید پیاده‌سازی کنه، یک تست مینویسیم و به خطا خوردن تست میشینیم.سبز: تلاش میکنیم که یک پیاده‌سازی ساده کنیم که تست را پاس کند.ری‌فکتور: بعد که تست سبز پاس شد برمیگردیم و سعی میکنیم بهبود بدیم کد را.این سه مرحله روی هر تسک کوچک انجام و ادامه میابد تا یک تسک بزرگتر انجام شود.چرخه‌ی عمر TDDادعاهای TDD موجود در جامعهمثل هر چیز دیگری TDD نیز موافق و مخالف دارد. عده‌ای میگویند که زیاد طول میکشد و سربار مازادیست بر تیم. از طرف دیگر عده‌ای دیگر هستند که میگویند که بخاطر تولید کدهای باکیفیت و افزایش بهره‌وری توسعه محصول کار ارزشمندی است. نتایج تحقیقات میدانی فراوانی نشان میدهد که هر دو طرف درست میگویند.دو نتیجه‌ی عمومی از تحقیقات: TDD منجر به افزایش کیفیت کد و تست‌ها میشوند. / TDD در کوتاه مدت کاهنده و در درازمدت افزاینده بهره‌وری خواهد بود.واقعیت اینست که  TDD باید روی برخی مسائل اجرا بشه تا هزینه‌اش، ارزش داشته باشد. و در واقع یک نسخه‌ی متعالی بر هر سناریویی نیست.افزایش ثبات با تست‌های خودکارهمه سازمان‌ها برای کدهای خودشون تست مینویسند که کد پیاده‌سازی شده را بررسی کنند و محصولی تمیز تحویل میشتری شود. معمولا واحد QA سازمان مسئول تست است که محصول کار کند. وقتی یک تست بصورت دستی انجام میشه verb میشه ولی میتونه هم با انجام خودکار به صورت یک noun شناسایی بشود.تست Automated قطعه کدی است که کد پیاده‌سازی شده را وریفای میکند و یک Assertionی مطرح میکند که کد به‌درستی کار میکند.ارزش استفاده از Automated test این است که به‌سادگی قابل تکرار باشد.تغییر QA با تست‌های خودکار و CIدر کنار تست های خودکار نقش QA میتونه موثر باشد. ماشین خیلی بهتر میتواند کارهای روتین تست دستی را انجام دهد و بنابراین انسان باید موارد پیچیده‌تر  را هندل کند. مانند مواردی که مرتبط به concurrency یا security هستند.در این حالت QA‌ نقشش از حالت انفعال به فعال یا Proactive تبدیل میشود. و تست‌های خودکار باعث میشوند همه کدها تست شوند و سریعتر فیچرها ریلیز شوند.اغلب این تست‌های در CI انجام خواهد شد و تنها در صورتیکه همه‌ی تست ها پاس شد امکان Deploy وجود دارد.از اجزای مهم هر پایپ‌لاین اجرای تست‌های خودکار و پاس شدن همه‌ی آنهاستتمایز TDD از تست واحدتی‌دی‌دی یک فرآیند است و میتواند با هر نوع تستی بیاید. در حالیکه یونیت تست فقط یک مدل از تست است.ادامه دارد ... در قسمت بعد مشکلاتی که TDD در سازمان‌ها میتواند یا نمیتوانند مرتفع کند را بررسی خواهیم کرد. همچنین برای شروع و سنجش اثربخشی و بهره‌وری استفاده از TDD راهکارهایی را بررسی خواهیم کرد.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sat, 09 Oct 2021 13:10:01 +0330</pubDate>
            </item>
                    <item>
                <title>دسترس‌پذیری؛ چرا و چگونه؟</title>
                <link>https://virgool.io/@rezab/accessibility-fovhwcnouglp</link>
                <description>مقدمهدسترس‌پذیری یا Accessibility، میزان و درجه آسان بودنِ دسترسی و یکی از قسمت‌های تجربه‌ی کاربری است و محدود به فضای وب نیست. اما متاسفانه در محیط‌های آنلاین، دسترس‌پذیری از توجه قابل‌ملاحظه‌ای برخوردار نیست.دسترس‌پذیری شامل المان‌های متعددی است و ساعت‌ها میشود راجع به آن صحبت کرد و کتاب خواند. این مقاله تلاش میکند توسعه‌دهندگان را ترغیب به در نظر گرفتن اهمیت فوق‌العاده‌ی این مورد مهم کند.اهمیت استفاده صحیح از HTML اسکرین‌ریدرها استایل‌دهی و کدهای پویاساز جاوااسکرپیت را متوجه نمیشوند. بنابراین شناخت و استفاده‌ی صحیح از HTML نظیر موارد ذیل، در بهبود دسترس‌پذیری کمک کننده هستند: استفاده از تگ‌های معنایی HTML5 (مانند nav / section / article )قرار دادن ویژگی alt جهت تصاویرتعیین زبان صفحه با ویژگی lang در تگ htmlاستفاده از ویژگی title جهت توضیحات بیشتر یک المانبا رعایت نکات فوق (بیشتر بخوانید) که هم به انسجام بیشتر توسعه کمک میکند و هم راهنمایی خوبی برای اسکرین‌ریدرها خواهد بود و مهمتر از همه گامی بلند در افزایش دسترس‌پذیری است، نائل خواهیم شد.دسترسی‌پذیری قابلیت‌ها برای کاربران کیبردکاربران متعددی وجود دارند که امکان استفاده‌ی رایج مانند آنچه سایر کاربران با موس تجربه می‌کنند، ندارد و این افراد شامل ناتوانان جسمی، نابینایان یا کاربرانی که به هر علتی نظیر جراحت یا در دسترس‌نبودن موس یا حتی به‌دلخواه، الزاما از کیبورد فقط میتوانند استفاده کنند.امکان استفاده از کیبرد (Keyboard focus) برای پیمایش اپلیکیشن مهم است. بنابراین، همه المان‌ها و قابلیت‌ها باید برای کاربران کیبردی هم امکان‌پذیر باشد و نه صرفا ناوبری و لینک‌ها.در ری‌اکت و اصولا SPAها بدلیل اینکه اسکرین‌ریدرها قادر به پیگیری تغییرات صفحه نیستند میتونیم از Refها استفاده کنیم که دسترسی مستقیم به DOM دارد و پس از ری‌اکشن و رندر و ظاهر شدن در صفحه آنرا انتخاب و فوکس کنیم. همچنین از پراپرتی tabIndex هم استفاده میکنیم که مطمئن بشیم با tab دسترس پذیر میشه.&lt;p ref={message} tabIndex=&quot;0&quot;&gt;Successfully Submitted&lt;/p&gt;مثال فوق رندر شرطی پس از کلیک روی دکمه‌ی ارسال را نمایش میدهد.استفاده از تکنیک پرش ناوبریفرض کنید کاربری با محدودیت‌های دسترسی روبروست و فقط با کیبورد میتواند در یک صفحه‌ی چند قسمته حرکت کند. در چنین حالتی باید امکان مخفی قرار دهیم که کاربر بتواند بجای پیمایش کلیه تب‌ها به سکشن‌های مهم دسترسی داشته باشد. بنابراین از سودوکلاس(pseudo-class) focus در CSS استفاده میکنیم و به شیوه‌ای از نمایش آنرا مخفی میکنیم و آنگاه که کاربر در حال پیمایش ناوبری است با تب کیبورد به آن میرسد، آنرا نمایش میدهیم و طبیعتا با کلید Enter به قسمت مدنظر کاربر را هدایت میکنیم.position: absolute;transform: translateY(-200%);transition: transform 0.3s;&amp;:focus {  transform: translateY(0%);}استفاده از رویدادهای صحیحدر استفاده از رویدادها هم باید دقت بیشتری به‌خرج داد و مثلا برای باز و بسته شدن یک منوی بازشونده از رویدادهایی نظیر  (خارج شدن از المان) و (آمدن روی المان) استفاده کنیم.تست میزان دسترس‌پذیریدم‌دست‌ترین ابزار موجود Lighthouse است که در قسمت DevTools مرورگر کروم قابل دسترس است. در واقع این ابزار غیر از گزارشاتی که جهت دسترس‌پذیری ایجاد میکنند، گزارشاتی در خصوص SEO و PWA و ... هم ارائه میدهد. این ابزار معیار و محک خوبی است که یک وب اپلیکیشن چقدر به میزان دسترس‌پذیری کاربرانش اهمیت میدهد.Lighthouseمطالعه بیشترجهت مطالعات بیشتر در این حوزه و کسب آخرین دستاوردها و گزارشات به وبسایت Webaim.org مراجعه نمایید.نتیجه‌گیریدر حال حاضر مخصوصا در فضای فعلی اپلیکیشن‌های ایرانی مفهوم Accessibility به‌اندازه‌ کافی درک و استفاده نشده است حال آنکه با کمی تمرکز و دقت حین توسعه اپلیکیشن روی این جنبه و تست دسترس‌پذیری المان‌ها و قابلیت‌ها برای همه‌‌ی طیف‌های کاربران، به‌طرز چشم‌گیری به نیاز مهمی از آنها توجه خواهیم کرد و تجربه‌ی کاربری بهتری را برای ایشان به ارمغان خواهیم آورد.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sun, 26 Sep 2021 01:10:14 +0330</pubDate>
            </item>
                    <item>
                <title>چندخطی بر شروع سال نو</title>
                <link>https://virgool.io/@rezab/%DA%86%D9%86%D8%AF%D8%AE%D8%B7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%B1%D9%88%D8%B9-%D8%B3%D8%A7%D9%84-%D9%86%D9%88-zi9dtwvszl0e</link>
                <description>روزهای پایانی سال ۹۹ و به‌تعبیری، آخرین روزهای قرن ۱۴ است و من بعنوان یک وبلاگنویس قدیمی -و البته در چندسال اخیر کم‌کار-، خواستم با نوشتنم اینجا، باهم کمی حال و هوای عید پیدا کنیم. حال و هوایی که این روزها به علل مختلف برای اکثر مردم جهان، به‌ویژه ما ایرانیان، چندان خوشایند نیست.نوشتن، همیشه خودآگاهی میدهد. خودآگاهی، درکی‌ست که از کنش آگاهانه‌ی سیستم دو -سیستمی که حالت خودکار نیست و آدمی را به تحلیل و کوشش وا میدارد.- حاصل میشود. بیاییم برای روزهای آخر سال، خاطره‌ای بنویسیم، چیزی بنویسیم... مثلا به آرزوی خود، نامه‌ای بنویسیم. آرزویی که میشود در سال نو، به رسیدنش نشست.قصدم راه‌اندازی یک چالش یا چیزی شبیه آنچه سابقا در وبلاگستان فارسی رسم بود و مناسبتی را بهانه میکردیم تا بیشتر حضور مجازی‌مان را حس کنیم، ندارم. شاید، بهتر است کوله‌بار سال کهنه را باز کنیم و ببینیم برای سال جدید چه چیزی میتوانیم به ارمغان ببریم.بیایم تکراری باهم بشنویم که زندگی آنقدر هم خارستان نیست و این ذهنیت ماست که گلستان را می‌سازد. تکراری به هم بگوییم آرزوهای بزرگ داشته باشیم و بلند نگاه کنیم. عشق و رقصیدن در باد را تجربه کنیم و به کوچکیِ مُحقرِ غم‌های دنیا، بخندیم. از بادهای سرخ و مه غلیظ جاده، با همان جذابیت قدیم عبور کنیم و شعله‌ی ابدی و نور بی‌منتها را دنبال کنیم. بگوییم به‌همدیگر که امیدمان ماناست، آرزوهامان زیباست.سال نوتون مبارک</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Wed, 17 Mar 2021 00:31:44 +0330</pubDate>
            </item>
                    <item>
                <title>زمان و ابزارهای مدیریت آن</title>
                <link>https://virgool.io/@rezab/time-management-qwyr12kyijii</link>
                <description>مقدمهبحث مدیریت زمان یک بحث قدیمی است که بشر از وقتی فهمید وقت طلاست، تلاش کرد با متدهایی هزینه‌ی انجام کارها را بکاهد و با هدف کاهش زمان انجام کار به بهبود فرآیندها کمک کرد تا هر کسی با داشتن تخصص در یک حوزه‌ی مشخص بتواند یک زندگی متعادلی داشته باشد و از سایر تخصص‌ها بدون دانش علمی آن، بهره‌مند شود و بدین شکل تمدن را تشکیل داد.در حوزه‌ی استعدادیابی، یکی از ملاک‌های سنجش استعداد، قطعا زمان است. زمان است که مشخص میکند چه‌کسی مستعدتر از دیگری است. در واقع اگر زمان نامحدود در اختیار هر شخصی قرار داده شود، احتمالا به نتایج و خروجی مطلوبی میرسد.بنابراین زمان، مشخصا از جمله مهمترین دارایی‌های هر موجود زنده‌ایست. چنین چیز پر اهمیتی در اثر سوء مدیریت یا بی‌توجهی بدان، منجر به بازدهی منفی خواهد شد. لذا، منطقی خواهد بود براساس اصول SMART (+)، هدفی انتخاب کرد و با خود کنترلی (Self-Control) که مدیریت زمان از جمله‌ی آن است، با سرعت بیشتر و در زمان کمتری، معنای زندگی خود را بیابیم و به نوک هرم سلسله‌مراتب نیازهایمان نزدیک شویم.حال که میخاهیم زمانمان را مدیریت کنیم، بسیاری در دام سوء مدیریت زمان می‌افتند. و خب چون پایش خودکنترلی جهت رسیدن به تعادل پایدار، توسط خود شخص انجام میشود، این خطر وجود دارد که به‌علت عدم کنترل ناظر خارجی، مدت‌های زیادی در دام باشند و بعد به‌علت ناکارآمدی آن، به مدیریت زمان ناباور گردند. لذا بهتر است اشتباهات آنرا نیز مرور کنیم.اشتباهات مدیریت زماننکات زیر در خصوص اشتباهات رایج مدیریت زمان را مرور میکنیم؛۱ - تمایل به سمت کم خوابی به عنوان گزینه ای برای افزایش زمان و داشتن مدیریت بهتر بر زمان. / هر چند این گزینه، انتخابی غلط است و باعث کاهش راندمان و بروز مشکلات دیگر می شود.۲ -  از مهمترین و تاثیرگذارترین اقدامات در حیطه مدیریت زمان، تهیه لیستی از کارهایی است که باید انجام شود. / اما به علت شلوغ نشدن برنامه، تنها کارهای زمان بر و طولانی در آن ثبت شود.۳ -  نوشتن هر چیزی در لیست کارها، بیشتر باعث وقت گیری و سردرگمی می شود.۴ -  لیست های بلند، انسان را عصبی و افسرده می کند و باعث استرس زایی می شود. / مدیریت زمان باید لذتما از انجام کارها را افزایش دهد.۵ -  استفاده از چندین ابزار مختلف و متنوع برای مدیریت زمان، باعث سردرگمی و وقت گیری می شود.۶ -  انجام دادن چند کار به صورت همزمان، باعث کاهش راندمان می شود. / در صورتی که اگر بر روی یک کار تمرکز کنیم، دقت و راندمان افزایش می یابد و انرژی کمتری مصرف می شود.۷ -  یکی دیگر از اشتباهات در مدیریت زمان، مدیریت همه لحظه ها و برنامه ریختن برای تمام دقایق است. / این امر، استهلاک قدرت کنترل را افزایش میدهد و باعث صرف انرژی زیاد از انسان می شود.۸ -  یکی از مهمترین نکات در مدیریت زمان و برنامه ریزی، برنامه ریزی نکردن برای بخشی از زمان هااست.۹ -  بهترین برنامه ریزی، برنامه ای است که تنها زمان ها و کارهای مهم رو برنامه ریزی کند.۱۰ -  کار بی وقفه  و پیوسته، باعث کاهش راندمان می شود. / برای این منظور در سیستم های مختلف، زمان استراحت و تنفس در برنامه تعریف می شود.همچنین: بهترین زمان استراحت در میان کار، زمان استراحت با کسانی است که حرف مشترکی با آنهانداریم و یا حرف مشترک کمی با آنها داریم.۱۱ -  داشتن وسواس برای انجام تمام کارها، از ریشه های اصلی عدم موفقیت در مدیریت زمان است.ابزارهای مدیریت زماندر ابتدا باید بگویم، مدیریت زمان هیچ ابزار خاص و ویژه‌ای نمیخاهد. واقعا میشود فقط با یک قلم و کاغذ به بهترین روش مدیریت زمان داشت. شاید مهمترین ویژگی ابزارهای مدیریت زمان، ساده‌کردن مدیریت کارها و کاستن دغدغه‌های مرتبط به آن است. مثلا سخت است که روی کاغذ معمولی بخواهیم یادآور در ساعت مشخصی تنظیم کنیم.بنده به شخصه با متد GTD دکتر آلن (یک خلاصه کاربردی) راحت هستم و البته از آن ایده گرفتم و به سبک خودم پیاده‌اش کرده‌ام.ابزارهای متعددی وجود دارد که تنوع آنها ممکن است شما را دچار تناقض انتخاب(مشاهده ویدیو آقای شوارتز در این خصوص) کند، و هدف از این پست همین بوده است که ابزارهای محدودی معرفی شود که شاید برای فردی رهگشا باشد.لیست ابزارهاگوگل کیپ +ترلو + یا تسکولو +در کیپ میتوانید نوت‌ها مختلفی (عکس، متن ساده، چک‌باکس، ویس و نقاشی) در رنگ‌ها و دسته‌بندی‌های مختلفی داشته باشید. یک انعطاف فوق‌العاده‌ای که هر جور ذهنیتی روی آن قابل اجراست. اگر بتوانید دو هفته بصورت مداوم با آن بصورت مقید کار کنید، سبک خود را خواهید یافت. میتوانید با ایده‌ی آقای آلن استارت بزنید. (داشتن Inbox ورودی کلیه کارها)یکی از مزیت خوب کیپ این است که در اوقاتی که شما در حال طوفان فکری (+) هستید، بلافاصله میتوانید صدای خود را در کیپ ضبط کنید یا تصویری از موقعیت جاری خود بعنوان یک نوت کیپ با دوربین گوشی ثبت کنید. بدین صورت ایده‌های شما در اثر یادداشت نشدن، از یاد نمیروند.به هر صورت بهتر است اگر حوصله‌ی کنکاش ندارید از یک مقاله(+) کیپ را بهتر بشناسید تا از کلیه قابلیت‌های آن استفاده کنید.برای بسیار کیپ، یک ابزار جامع است و هرگز نیاز به ابزار کمکی دیگری نخواهد بود. اما رده‌ی کیپ، برای مدیریت پروژه‌ها نیست و مدیریت اهداف استراتژیک نیاز به بستری با امکان مرتبط‌تر خواهد داشت.خب در این حوزه به‌دلیل حضور سازمان‌ها و تجمع درخواست‌های مشابه، سرویس‌های فوق‌العاده‌ای ایجاد شده است. مثلا آسانا یا ماندی که واقعا هر یک در رده‌ی کاری خود عالی هستند. ولی مفاهیم و ابزارهای مطرح شده تا حدود زیادی مانند هم هستند. بنابراین یکی از آنها (پیشنهاد من ترلو است) را انتخاب و برای مدیریت پروژه‌ها و اهداف استراتژیک شخصی و کارهایی که باید بصورت سلسله‌وار در میان‌مدت و دراز مدت انجام شوند استفاده کنید. اکثر چنین اپلیکیشن‌هایی از بوردهایی همچون کانبان(+) استفاده میکنند و دارای امکانات غنی‌تر از کیپ هستند.سلیقه و متد هر کسی با دیگری در استفاده از ابزار مدیریت زمان میتواند متفاوت باشد و برای همین هم پلتفرم‌های مدیریت زمانی به‌قدر زیادی منعطف طراحی شده‌اند ولی ذکر مثال کمک خواهد کرد ایده بگیریم. بعنوان مثال خودم یک بورد کتابخانه در ترلو دارم، که دارای سه لیست است (مشاهده و بررسی / در حال مطالعه / مطالعه شده) البته منطق من در خواندن کتاب این‌ست که از اول تا آخر نخوانم و فقط جاهای مهم! را بخوانم. و  اگر بشود با مقاله جای آن چند فصل مهم کتاب را گرفت، از خواندن مقاله در ازای آن بیشتر استقبال خواهم کرد. بنابراین کتاب‌های محدودی خواهند توانست که در کتابخانه‌ام (در ترلو) جا بگیرد و البته در لیست در حال مطالعه‌هایم نباید بیشتر از دو کتاب حضور داشته باشند. هنگامیکه کتابی میبینم که ممکن است جالب باشد و از فیلترها عبور کرده باشد، در لیست اولم می‌آیند در فرصتی کاملتر بررسی شوند و در صورتیکه مناسب باشد به لیست در حال مطالعه منتقل میشود. همچنین پس از مطالعه به لیست مطالعه شده منتقل شده میرود.در پایان، اگر عزیزانی روش دیگری تست کرده‌اند و جالب میداند در کامنت‌ها به اشتراک بگذارند. که سایر دوستان هم بتوانند استفاده کنند.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sat, 07 Dec 2019 21:10:34 +0330</pubDate>
            </item>
                    <item>
                <title>کمی درباره سیستم‌های توزیع شده</title>
                <link>https://virgool.io/@rezab/distributed-systems-ddprnr99olfj</link>
                <description>تعریف :یک مجموعه از Computerهای مستقل که از نظر کاربر یک Computer و یک سیستم واحد و منسجمند.سیستم‌های توزیع شده در واقع هنری هستند که بوسیله آنها می‌توانید مشکلاتی را که در یک کامپیوتر وجود دارند، با استفاده از چند کامپیوتر رفع کنید و معمولا به این دلیل انتخاب می‌شوند که این مشکلات توسط یک کامپیوتر رفع نمی‌شوند.مجموعه ای از پردازشهای مرتبط به هم، بصورتی که هر پردازش از حافظه داخلی مرتبط با خودش استفاده کند و تمام این پردازش‌ها از طریق Message passing در سطح شبکه با یکدیگر در ارتباطند.تقسیم بندی وظایف یک سیستم بزرگ به زیرسیستمهایی که در سخت افزارهای مجزا اجرا می‌شوند و کاربر هیچ تصوری از وجود این زیر سیستمها ندارد.روش Replicate روی یک یا چند Cluster استفاده می‌کنیم. یعنی چند کپی از سرویس، روی چند سرور داشته باشیم؛ به این صورت که همه آنها فعال باشند. درخواست‌ها با الگوریتمی که انتخاب می‌کنیم، از طریق Load Balancer بین این Node‌ها پخش می‌شوند. با این روش، هم کارآیی سیستم بالا می‌رود و هم همیشه Nodeهایی وجود دارند که جای Node‌های از دسترس خارج شده را بگیرند.مفهموم Horizontal Scaling یا Scale-out: توسعه‌ی افقی منابع با افزایش درخواست‌ها و کاربران.تقریبا تمام چالش‌هایی که برای سرویس وجود داشت، برای Database نیز وجود دارد. به همین دلیل باید Database نیز بصورت توزیع شده پیاده سازی شود:مهمترین فاکتورهای انتخاب سیستمهای توزیع شدههزینه /   در دسترس بودن سیستم / تعداد یا نوع کاربران سیستم / تعداد درخواست‌های از سیستم / نوع و حجم عملیاتی که انجام می‌دهیم: برای افزایش کارآیی و پردازش تعداد بیشتر درخواست‌ها، گاهی بهتر است یک عملیات را تبدیل به عملیاتی کوچکتر کرد و هرکدام از این عملیات کوچکتر را در یک سخت افزار جداگانه اجرا کرد. / کارآیی: با یک طراحی و تقسیم بندی درست در قسمتهای مختلف سیستم می‌توان حجم و تعداد بسیار زیادی از پردازش‌ها را بصورت همزمان اجرا کرد.یک  Message Broker  یک کامپوننت فیزیکی است که ارتباطات بین سیستمهای  مختلف را مدیریت می‌کندبا استفاده از Message Broker بجای اینکه سیستم‌های مختلف بصورت مستقیم با یکدیگر در ارتباط باشند، تنها با  Message Broker در ارتباط اند و در اینجا Message Broker نقش یک Interface را بصورتی ایفا می‌کند که وظیفه آن به حداقل رساندن وابستگی‌های مستقیم بین سیستم‌های مختلف استنحوه ارتباط قسمت‌های مختلف هم به این صورت است که یک سیستم با ارائه مشخصات گیرنده یا گیرندگان، یک Message را برای Message Broker  ارسال می‌کند و سپس Message Broker با روشها و الگوریتم‌هایی که در اختیار دارد و با جستجو در بین سیستم‌هایی که با آن مشخصات در آن ثبت شده‌اند، Message را برای آنها ارسال می‌کند.ارتباط بین Application ‌ها تنها شامل ارسال کننده و Message broker و گیرنده‌های مشخص شده‌است و سایر سیستم‌ها در آن دخیل نیستند.بدلیل اینکه Message Brokerها از یک صف انتقال اطلاعات استفاده می‌کنند، احتمال از دست رفتن Messageها به حداقل ممکن می‌رسد.از دیدگاه کنترل جریان، Message Brokerها محدودیتی در تعداد سیستم‌های متصل به خودشان و  زمان اتصال آنها ندارند. یعنی Message Brokerها این قابلیت را دارند حتی در زمان اجرا نیز سیستم‌های جدید را بپذیرندبطور خلاصه Message Brokerها مدیریت همکاری بین سیستم‌های مختلف را بر عهده دارند. قرار دادن Message Brokerها بین ارسال کنندگان و دریافت کنندگان، انعطاف پذیری را در ارتباط بین سیستم‌های مختلف افزایش می‌دهد و با کمترین میزان تغییر در ارسال کنندگان و گیرندگان می‌توانید قابلیت‌های جدیدی را به سیستم اضافه کنید.می‌توانیم از message brokerها برای مدیریت وابستگی‌ها و ارتباطات بین سیستم‌های فعلی(مونولیتیک) که داریم نیز استفاده کنیم</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Mon, 30 Sep 2019 17:54:56 +0330</pubDate>
            </item>
                    <item>
                <title>شرت‌کات‌های دوست‌داشتنی ویژوال استادیو</title>
                <link>https://virgool.io/@rezab/visual-studio-shortcut-tips-nmit4nlwmu8n</link>
                <description>درست است که معمولا برای موفقیت راه میان‌بری وجود ندارد، اما میشود با سرعت بیشتری این مسیر را پیمود. به‌خاطر سپردن short cut ها شاید در ابتدا ساده نیایند ولی در گذر زمان و بخاطر سپردن پرکاربردترین آنها زمان‌های زیادی را زنده خواهد کرد.سریعتر کد زدن نیازمند یادگیری شرت‌کات‌ها و کار کمتر با موس است. جهت یادگیری باید از حافظه‌ای ماهیچه‌ای بهره (حالت دست حفظ شود) برد و در ناخودآگاه قرار گیرد.ویژوال استادیو، شاید بهترین IDE دنیا باشد که روی همه‌ی پلتفرم‌ها در دسترس است. البته ویژوال استادیو کد، که انعطاف بینظیری دارد و کد ادیتور فوق‌العاده‌ای هم هست شرت‌کات‌هایی دارد که از اینجا مطالعه بفرمائید. اما در ادامه، خلاصه‌ای از مهمترین شرت‌کات‌های ویژوال استادیو آمده است.استفاده از Ctrl + Delete کلمه به کلمه از پشت پاک میکند.استفاده از Ctrl + Backspace کلمه به کلمه از جلو پاک میکند.استفاده از Ctrl + L در ابتدای یک خط، آنرا حذف میکند.استفاده از Ctrl + D در ابتدای یک خط، آنرا کپی/پیست میکند در خط بعدی.استفاده از بوک‌مارک در Visual Studio جهت مارک کردن مواردی که نیاز به توجه و رسیدگی در آینده دارند که فراموش نشود. با شورت‌کات Ctrl + K + Kجمع و جور شدن کد : Ctrl + M + Mجهت تمرکز بیشتر کلیه تب‌های اضافی بسته شود و فقط آنهایی که درگیر هستند باز باشد که لیست Ctrl + tab هم چندان بزرگ و گیج‌کننده نباشد. با Ctrl + f4 تب را میبنیدیم.یکی از سریعترین موارد جستجو Edit → Go to All هستش که میتونه در تایپ T / تازه‌ها R / فایل‌ها F بگرده که در تنظیم گذاشته شد Ctrl + Tبرای ماکزیمم فول‌اسکرین کد کردن: Alt + Shift + Enterجهت جستجو بعد از Ctrl + f میتونیم با F3 بتابیم داخل مواردی که پیدا شده است.جهت Replace کردن بعد از زدن Ctrl + h و زدن عبارت کلید Alt + a برای جایگزینی همه استفاده میشود.جهت دیباگ کردن F9 را روی خط کدی که هستیم میزنیم و برای برداشته شدنش نیز همین کلید را فشار میدهیم.برای دیباگ ابتدا StepOver (F10) را میزنیم بعد اگر نتیجه مطابق میل نبود StepInto (F11) را میزنیم.اگر اشتباهی در دیباگ‌مد StepInto شدیم میتونیم با StepOut (Shift+F11)جهت فرمت‌دهی کردن به کد از Ctrl+K+F استفاده کرد.جستجو در سلوشن: Ctrl + ;جستجو در تنظیمات وی‌اس: Ctrl + qپیدا کردن ابتدا و انتهای براکت: « Ctrl + ] »</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sat, 28 Sep 2019 19:18:47 +0330</pubDate>
            </item>
                    <item>
                <title>مختصری از اصول توسعه نرم‌افزار</title>
                <link>https://virgool.io/@rezab/%D9%85%D8%AE%D8%AA%D8%B5%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%A7%D8%B5%D9%88%D9%84-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D9%86%D8%B1%D9%85%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-tnehqgfbkoct</link>
                <description>در بحث‌های مهندسی نرم‌افزار و مخصوصا توسعه‌ نرم‌افزار و برنامه‌نویسی یکسری اصول و بهترین‌روشها (Best Practices) و الگوهای طراحی (Design Patterns) وجود دارد، که در واقع اگر به‌خوبی درک شوند و البته در جای متناسب استفاده شود، راحتی و پایداری توسعه را تضمین میکند و عمر مفید نرم‌افزار را به‌شدت افزایش میدهد.با هم چند اصل مهم و معروف دنیای نرم‌افزار را مرور میکنیمDRY – Don&#x27;t Repeat Yourself: The guiding thought behind the Don&#x27;t Repeat Yourself (DRY) principle is that duplication is a waste of time and effort.KISS - Keep It Simple Stupid: stresses that simplicity should be the goal and complexity should be avoided.You Aren&#x27;t Gonna Need It (YAGNI) simply states that functionality should only be added when it is requiredBy taking a Minimum Viable Product (MVP) approach, the scope of a piece of work is limited to the smallest set of requirements in order to produce a functioning deliverable.SOLIDSingle responsibility principle : A class should have only one responsibility.اصل SRP برای رفع این مشکل میگوید &quot;هر ماژول نرم افزاری میبایست تنها یک دلیل برای تغییر داشته باشد&quot;.اصل OCP  -  Open Close Principle میگوید : &quot;ماژول‌های نرم افزار باید برای تغییرات بسته و برای توسعه باز باشند.”1- استفاده از وراثت (inheritance):2- متدهای  الحاقی (Extension Method):اصل LSP -  Liskov substitution principle میگوید : &quot;زیر کلاس‌ها باید بتوانند جایگزین نوع پایه‌ی خود باشند&quot;.اصل ISP– Interface Segregation principleاصل ISP  میگوید : &quot; کلاینت‌ها نباید وابسته به متدهایی باشند که آنها را پیاده سازی نمی‌کنند. “بجای پیاده‌سازی کلیه متدها در یک اینترفیس، در ایتنرفیس‌های جداگانه بنا به نیاز طراحی میشود که پیاده‌کنندگان آن اینترفیس فقط موارد مدنظرشان پیاده‌سازی شود.public interface IEmployeeReportBAL{
void GeneratePFReport();
void GenerateESICReport();
}public interface IManagerReportBAL : IEmployeeReportBAL{
void GenerateResourcePerformanceReport();
void GenerateProjectSchedule();
}public interface IAdminReportBAL : IManagerReportBAL{
void GenerateProfitReport(); // فقط ادمین نیاز به پیاده‌سازی چنین متدی دارد و نه کارمند و مدیر
}اصل DIP  به ما میگوید : &quot; ماژول‌های سطح بالا نباید به ماژولهای سطح پایین وابسته باشند، هر دو باید به انتزاعات وابسته باشند. انتزاعات نباید وابسته به جزئیات باشند، بلکه جزئیات باید وابسته به انتزاعات باشند. &quot;.بقول Uncle Bob، سیستم‌هایی که مدیریت وابستگی در آن رعایت نمی‌شود این ۴ بو (Smell) را همراه خود خواهند داشت:سختی یا Rigidityسختی یا Rigidity یعنی ناتوانی در تغییر. /  اگر برای تغییر دادن بخش کوچکی از کد مجبور شویم کل سیستم را مجددا rebuild کنیم، آنوقت آن سیستم سخت شده یا دچار Rigidty شده است.شکنندگی یا Fragilityمفهوم Fragility و Rigidity بسیار بهم نزدیک اند. درواقع شکنندگی و سختی، علت و معلول یکدیگر هستند. شکنندگی یا Fragility اشاره دارد به اینکه هر موقع تغییری در سیستم ایجاد می‌کنید در بخش (یا بخش‌های) دیگری از سیستم - که حتی هیچ ربطی با آن قسمت ندارد - با خطا و مشکل مواجه می‌شوید.عدم تحرک یا Immobilityنتوانیم آن قسمت از کد یا کامپوننت را در دیگر بخش‌های سیستم استفاده کنیم.چسبناکی یا Viscosityچسبناکی، ویسکوزیته یا Viscosity مقاومت در مقابل تغییر است. وقتی که ساخت مجدد و تست سیستم برای ما سخت می‌شود و ترجیح بدهیم از خیر تغییرات آن قسمت بگذریم، آنگاه کد ما viscous یا چسبناک است.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sat, 17 Aug 2019 23:22:37 +0430</pubDate>
            </item>
                    <item>
                <title>کمی در مورد Razor Page</title>
                <link>https://virgool.io/@rezab/%DA%A9%D9%85%DB%8C-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-razor-page-w6edwlpcs9n7</link>
                <description>برنامه‌نویسان دات‌نت در سمت ویو ابزاری دارند که هرچند در دیباگینگ آزاردهنده است اما مزایایی که ارائه میدهد، راضی‌کننده است، اسم آن Razor است. در واقع ریزر موتور Viewای هست با زبان تلفیقی C# و HTML تلاش میکند که صفحاتی با منطق برنامه‌نویسی تولید کنیم. وجود تگ هلپرها در ویو کار توسعه در View را جذاب‌تر هم کرده است.اما این مطلب در خصوص این موتور پیشرفته نیست. که در خصوص صفحات ریزر هستند. صفحاتی که آمده است تا با الهام از گذشته (وب‌فرم) به ساده‌تر شدن سیکل توسعه کمک کند. الگوی MVC معمولا نباید در هر جایی استفاده شود. خیلی اوقات پیاده‌کردن منطق یک صفحه‌ی تماس با ما نیازی به پیچیدگی زیاد ندارد  یک View است و یک لاجیک. این استکه ماکروسافت در کنار استفاده از MVC این امکان را فراهم کرد که بتوانیم از قسمتی از فریم‌ورک MVC به نام‌ Razor Page، بتوانیم با داشتن Viewهای ریزر و PageModelهای پشت آن توسعه را سریعتر پیش ببریم.در ادامه نکاتی از ریزر پیج آمده استبرای سایتهایی که صفحات زیادی دارند گزینه ی مناسبی است اما برای وب سرویس ها یا پروژه هایی که از AJAX زیاد استفاده می کنند کارایی ندارد.مایکروسافت تاکید می کند که Razor Page فقط برای طراحی سایت های کوچک نیست و می توانید برای پیاده سازی هر سایتی از آن استفاده کنیدجهت نمایش ولیدیشن فرم از asp-validation-for استفاده میشود و در حالیکه برای مدل‌ولیدیشن (که ترکیبی که پراپرتی‌ها هست) از asp-validation-summary استافده میشود.با استفاده از تگ‌هلپر asp-page-handler میتوانیم کنترلر کنیم که کدام متد پست شدن یک فرم را مدیریت میکند. در کد بی‌هایند بایستی اسمی که بعنوان هندلر وارد شده است پس از OnPost وارد شود.در نسخه Razor Pages امکان استفاده از ViewBag وجود ندارد و این امکان قرار نیست به آن اضافه شود. به طور کلی توصیه میشود همیشه از ViewData استفاده کنید چون ViewBag متغیر دینامیک است و پردازش آن زمان بیشتری میگیرد.ما می توانیم قالبی را در مسیرهای دوستانه تعریف کنیم که هر آدرسی را که به هیچ فایل موجودی اشاره نمی کند دریافت کرده و مثلا به صفحه index.cshtml نگاشت کند.services.AddMvc().AddRazorPagesOptions(options =&gt;{options.Conventions.AddPageRoute(&quot;/index&quot;, &quot;{*url}&quot;);}دایرکتیو  page@، باید در ابتدای صفحۀ Razor قرار بگیرد. این دایرکتیو رفتار اصلی سایر Razorها را تحت تأثیر قرار می‌دهد.@page@using MyApp@using MyApp.Pages@using Microsoft.AspNetCore.Mvc.RazorPages@addTagHelper &quot;*, Microsoft.AspNetCore.Mvc.TagHelpers&quot;@model ContactModel&lt;html&gt;&lt;body&gt;...------sing Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.RazorPages;namespace MyApp.Pages{public class ContactModel : PageModel{public ContactModel(ApplicationDbContext db){Db = db;}[BindProperty]public Contact Contact { get; set; }private ApplicationDbContext Db { get; }public async Task&lt;IActionResult&gt; OnPostAsync()...کد زیر معادل کد فوق است@page@using MyApp@using Microsoft.AspNetCore.Mvc.RazorPages@addTagHelper &quot;*, Microsoft.AspNetCore.Mvc.TagHelpers&quot;@inject ApplicationDbContext Db@functions {[BindProperty]public Contact Contact { get; set; }public async Task&lt;IActionResult&gt; OnPostAsync(){if (ModelState.IsValid){Db.Contacts.Add(Contact);await Db.SaveChangesAsync();return RedirectToPage();}return Page();}}&lt;html&gt;&lt;body&gt;...اگر در تگ img از asp-apend-version استفاده کنیم و مقدار انرا مقداری در انتهای src افزوده میشود که در صورتیکه عکس بروز گردد، از سرور خوانده میشود در غیراینصورت از کش میخواند.&lt;img src=&quot;~/images/asplogo.png&quot; asp-append-version=&quot;true&quot;&gt;میتوانیم از تگ‌هلپر کش قسمتی از محتوا با مشخص کردن اعتبار آن، برای ارتقا سرعت و پرفورمنس اقدام کرد&lt;cache expires-after=&quot;@TimeSpan.FromSeconds(120)&quot;&gt;@DateTime.Now&lt;/cache&gt;</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Fri, 19 Jul 2019 09:40:39 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه‌نویسی Async</title>
                <link>https://virgool.io/fboard/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3%DB%8C-async-ebilaoyzga9p</link>
                <description>در دنیای وب استفاده از Async و Sync در جای مناسب خود، بسیار اهمیت دارد و مخصوصا که با توجه به بالا رفتن حجم تراکنش‌ها و داده‌ها و البته متعاقب آن، هزینه‌های سرور، هر چه سعی کنیم به‌نوعی سربار را کم کنیم یا از ظرفیت‌های موجود به نحو صحیح‌تری استفاده کنیم، سرویس‌دهی بهتری را برای مشتریانمان به ارمغان خواهیم آورد.خیلی اوقات عملیات ما I/O Bound است (کار با دیتابیس). یعنی یک عمل به‌دلیل اینکه منتظر شبکه یا خواندن هارد است، منتظر میماند و عملا از تمام توان CPU استفاده نمیشود. خاصیت async کردن اینست زمانیکه علیاتی I/O باند داریم، میتوانیم به رکئوست‌ها بیشتری پاسخ دهیم. استفاده از async الزاما، سرعت را سریعتر نمیکند. اگر روی یک پردازنده‌ی تک‌هسته‌ای باشیم، عملا به‌دلیل جابجایی زیاد بین Threadها، کندتر هم خواهد شد. اما اگر پردازنده چند هسته‌ای باشد، ممکن است سیستم‌عامل تشخیص دهد برخی از عملیات را در Threadهای جداگانه انجام دهد. اما اگر بخاهیم مجبور کنیم که سیستم‌عامل از چند هسته استفاده کند، بایستی از برنامه‌نویسی موازی استفاده کنیم.برنامه‌نویسی concurrent، یعنی عملیات رو به چند تکه تقسیم کنیم و آنهارا با هم پیش ببریم. اینجوری همه‌ی عملیات با هم انجام میشود و حس رضایت بهتری دارد.برنامه نویسی parallel، انجام کل عملیات با هم هست. و اندازه کل عملیات به اندازه بیشترین زیرعملیات است. مشکل آن اینست که اگر وابستگی بین زیرعملیات وجود داشته باشد، ممکن است خطاساز باشد. یا مثلا یک عمل یکسان، در آن واحد توسط چند نفر انجام میشود (مثلا خرید آخرین محصول از انبار)… و بنابراین سعی میکنیم که زیاد از برنامه‌نویسی موازی استفاده نکنیم.ترد پول ThreadPool، در دات نت تعداد زیادی ترد خالی رزرو در نظر گرفته میشود، هر موقع رکوئستی اومد سمت iis یا kestrel، یک ترد به آنها تخصیص داده میشود. دو نوع CLR ThreadPool داریم، یکی worker که برای عملیات ریاضی است که cpu bound هستند و دیگری I/O competion port زمانیکه از async استفاده میکنیم، از این نوع ترد استفاده میکند.در وب توصیه میشود از متدهای Async استفاده کنید. معمولا پیاده سازی متدهای Async پیچیده تر است و کد نویسی آن زمان بیشتری می برد. اما در این روش منابع سرور به سرعت آزاد میشود و می تواند به Request های بیشتری پاسخ دهد. مخصوصا زمانی که با فایل یا دیتابیس کار می کنید.در بیشتر مواقع Race Condition در برنامه نویسی Async رو میدهد. در این حالت دستورات بلافاصله اجرا نمیشوند بلکه سیستم عامل زمان اجرای آنها را مشخص میکند. شما فقط می توانید رویدادی دریافت کنید که پایان یافتن اجرای متد را گزارش میدهد.ابزار bombardier ابزاری برای ایجاد تعداد دلخواهی Connection  و request برای تغییر هر اکشنی از sync به async کافی هست که async را قرار دهیم که خروجی آن باید Task&lt;T&gt; باشد را اضافه کنیم و در مواردی که میخاهیم عملیاتی را بصورت async اجرا کنیم پشت‌اش await میگذاریم. که بایستی از نسخه‌ی async آن عملیات استفاده شودawait _context.SaveChangesAsync();وقتی بخشی بصورت async پیاده کنیم باید برای استفاده از آن نیز async استفاده کرد.همچنین برای sync. نباید همزمان از دو روش استفاده کرد. مثلا اینکه بخواهیم دستورات Async را با .wait() بصورت سینک اجرا کنیم، ترد مربوطه را قفل میکند و منتظر میشه خروجی async بدست بیاید.استفاده از wait میتواند بسیار تاثیر منفی در پرفورمنس بگذارد چرا که دو ترد اشغال شده است و ظرفیت را نصف میکند.همچنین استفاده سینک در متدهای Async اشتباه است.یکی از روش‌های بهینه برای اجرای Async اینه که بصورت concurrent آنرا اجرا کنیم. بدین صورتکه بجای اینکه پشت هر عملی آسکرونی await بگذاریم آنرا جمع کنیم و یکجا اجرا کنیمvar result = await Task.WhenAll(UserTask,BookTask);کلمه کلیدی await منظورش این هست که در هر خط RunTime باید صبر کند تا زمانیکه کار اون عملیات تمام شود تا به خط بعدی بروددر Task.WhenAll منتظر میماند تا همه‌ی خروجی‌ها تولید شوند. که نتایج را در یک آرایه میرزد و برای دسترسی به نتایج آن result[0] برای متغییر اول و الی‌آخر…امکان استفاده از گزینه‌ Task.WhenAny وجود دارد. که به‌محض اینکه یکی از خروجی‌ها تولید شدند، تکمیل میشود.در سی‌شارپ اگر اکسپشنی رخ دهد بصورت حبابی به آنکه صدایش زده برگشت داده میشود. اگر async void داشته باشیم و خطا رخ دهد چون برنامه دارد در ترد دیگری اجرا میشود بایستی جهت اطلاع به لایه بالاترش بگوید که خطا رخ داده که چون void است دسترسی ندارد و ارتباط قطع میشود. برای همین هیچگاه نباید از این استفاده کرد و باید async task استفاده نمود.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sun, 14 Jul 2019 23:04:37 +0430</pubDate>
            </item>
                    <item>
                <title>کمی در مورد Vue.js</title>
                <link>https://virgool.io/@rezab/vuejs-lrq4oiesr6lh</link>
                <description> در چند سال اخیر مخصوصا با اوج گرفتن رقابت‌های شدید لایبرری‌ها و فریم‌ورک‌های جاوااسکریپتی سمت کاربر، نام سه رقیب بیش از پیش به‌چشم میخورد. انگولار که یک فریم‌ورک است و سنگین و البته سازمانی است. ری‌اکت که همچنان محبوب‌ترین است و البته Vue.js. طبق  پیش‌بینی‌ها و با توجه به مجموع جوانب vue اگرچه از دو رقیب دیگر از نظر میزان استفاده و بزرگی جامعه عقب است اما میزان نسبی رشدش بیش از دو مورد دیگر است. همچنانکه منحنی یادگیری کوچکتری دارد و در هر پروژه‌ای امکان استفاده دارد،  از این رو بهتر است راجع به vue بیشتر بدانیم. بهترین مکان یادگیری Vue.js، قسمت گاید خود سایت رسمی است. Introduction — Vue.js منظور از Progresive که Vue به خودش میگه این است که لازم نیست از همه‌ی قابلیت‌های آن در برنامه استفاده کرد. ملزم به استفاده‌ی از امکانات vue نیستیم. مثلا میتوانیم بجای ajax آن از jquery ajax استفاده کرد / میتوان به سادگی اعتبارسنجی یک فیلد از Vue استفاده کرد یا میتوانیم بصورت کامل اپلیکیشن تک‌صفحه‌ای داشتخوبیش اینکه vue میتونه هر صفحه‌ای اضافه شود. (مثل jquery) خود vue یک هسته‌ی مرکزی دارد به‌اضافه‌ی چند تا فریم‌ورک که ممکنه خیلی استفاده شود. ما بقی را بخاطر سبکتر شدنش جدا کردههر اپلیکیشنی که میتوانیم با Angular پیاده کنیم با Vue هم میتوانیم و همینطور برای React هم هرکاری توش میکنیم میتونیم در Vue هم بکنیمدیتابایندینگ عمل کپی کردن داده‌های جاوااسکریپت به تگ‌های html است &lt;div id=&quot;app&quot;&gt;{{message}}&lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: { message: &quot;Test Message form Vue!&quot;            }        });    }در زیر نحوه استفاده از دایرکتیو v-model &lt;div id=&quot;app&quot;&gt;    &lt;input type=&quot;text&quot; v-model=&quot;message&quot; /&gt;    {{message}}&lt;/div&gt;در اینجا متغییر message را بعنوان مدل در نظر میگیرد و چون در input است با تغییر آن مدل نیز تغییر میکند. این حالت اعمال دو طرفه را tow-way binding میگند.چاپ اسم و فامیل به روش بایندینگ دو طرفه&lt;div id=&quot;app&quot;&gt;    &lt;input type=&quot;text&quot; v-model=&quot;first&quot; /&gt;    &lt;input type=&quot;text&quot; v-model=&quot;last&quot; /&gt;{{first}} {{last}} &lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: { first:&quot;&quot;,                last:&quot;&quot;            }        });    }جهت استفاده از هاید/شو از دایرکتیو v-show استفاده میکنیم &lt;div id=&quot;app&quot;&gt;    &lt;div v-show=&quot;isShow&quot;&gt;        {{message}}    &lt;/div&gt;&lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: {                message:&quot;this is a test&quot;,isShow:false            }        });    }شو هاید کردن به‌روش کنترل روی رخدادها   &lt;div id=&quot;app&quot;&gt;    &lt;input type=&quot;checkbox&quot;  id=&quot;canShowCheck&quot; v-on:click=&quot;ShowHide&quot; /&gt;    &lt;div v-show=&quot;isShow&quot;&gt;        {{message}}    &lt;/div&gt;&lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: {                message: &quot;this is a test&quot;,                isShow: false            },            methods: {                ShowHide: function () {                    this.isShow = !this.isShow;                }            }        }); روی چک‌باکس رخداد کلیک را تعریف کرده‌ایم که موقع کلیک متدی اجرا شود که مقدار isShow که در دایرکتیو v-show مسئول شو هاید است را مقدار دهدهر موقعی که میخاهیم مقدار attributeهای تگ html را مقداردهی کنیم از دایرکتیو v-bind استفاده میکنیم. &lt;div id=&quot;app&quot; &gt;    &lt;input type=&quot;text&quot; v-model=&quot;messageStyle&quot; /&gt;    &lt;input type=&quot;checkbox&quot;  id=&quot;canShowCheck&quot; v-on:click=&quot;ShowHide&quot; /&gt;    &lt;div v-show=&quot;isShow&quot;  v-bind:style=&quot;messageStyle&quot;&gt;        {{message}}    &lt;/div&gt;&lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: {                message: &quot;this is a test&quot;,                isShow: false,messageStyle:&quot;color:blue&quot;            },            methods: {                ShowHide: function () {                    this.isShow = !this.isShow;                }            }        });    }برای گشتن در یک مجموعه جهت نمایش آن مثلا در یک لیست یا جدول از دایرکتور v-for استفاده میکنیم &lt;div id=&quot;app&quot; &gt;    &lt;ul v-for=&quot;lang in langs&quot;&gt;        &lt;li&gt;{{lang}}&lt;/li&gt;    &lt;/ul&gt;    &lt;input type=&quot;text&quot; v-model=&quot;messageStyle&quot; /&gt;    &lt;input type=&quot;checkbox&quot;  id=&quot;canShowCheck&quot; v-on:click=&quot;ShowHide&quot; /&gt;    &lt;div v-show=&quot;isShow&quot;  v-bind:style=&quot;messageStyle&quot;&gt;        {{message}}    &lt;/div&gt;&lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: {                message: &quot;this is a test&quot;,                isShow: false,                messageStyle: &quot;color:blue&quot;,langs:[&quot;1&quot;,&quot;2&quot;,&quot;3&quot;]            },            methods: {                ShowHide: function () {                    this.isShow = !this.isShow;                }            }        });    }مثلا برای پر کردن یک فرم میتونیم اطلاعات را در مدل ذخیره کنیم و بعد با ajax به سرور بفرستیم. &lt;div id=&quot;app&quot; &gt;    &lt;ul v-for=&quot;lang in langs&quot;&gt;        &lt;li&gt;{{lang}}&lt;/li&gt;    &lt;/ul&gt;    &lt;select v-model=&quot;SelectedLang&quot;&gt;       &lt;option v-for=&quot;lang in langs&quot; v-bind:value=&quot;{{lang}}&quot;&gt;{{lang}}&lt;/option&gt;    &lt;/select&gt;    &lt;input type=&quot;text&quot; v-model=&quot;messageStyle&quot; /&gt;    &lt;input type=&quot;checkbox&quot;  id=&quot;canShowCheck&quot; v-on:click=&quot;ShowHide&quot; /&gt;    &lt;div v-show=&quot;isShow&quot;  v-bind:style=&quot;messageStyle&quot;&gt;        {{message}}    &lt;/div&gt;    &lt;div&gt;        {{SelectedLang}}    &lt;/div&gt;&lt;/div&gt;@section Scripts{            var app = new Vue({            el: &quot;#app&quot;,            data: {                message: &quot;this is a test&quot;,                isShow: false,                messageStyle: &quot;color:blue&quot;,                langs: [&quot;Reza&quot;, &quot;Hadis&quot;, &quot;Hassan&quot;, &quot;Badri&quot;],SelectedLang:null            },            methods: {                ShowHide: function () {                    this.isShow = !this.isShow;                }            }        });    }معمولا از vuejs بصورت جزیره‌ای استفاده میشود (مثلا برای ولیدیشن)در واقع صفحات مختلف دارای اپلیکیشن‌های مجزایی از اپلیکیشن هستن. در واقع مولتی‌اپلیکیشن مولتی پیج داریم بجای سینگل پیج اپلیکیشن.برای صفحاتی که کاربر خیلی با UI ارتباط برقرار میکند از vue استفاده میکنیم. ولی برای صفحاتی که قرار است فقط کاربر اطلاعاتی را ببیند یا صحفات ادمین که کاربر خاصی ندارد ضرورتی ندارد و از همان امکانات سمت سروری استفاده شود. کتابخانه‌ی Axios جهت صدا زدن http کاربرد داره و جایگزین خیلی سبک‌تری هست نسبت به jquery ajax</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sat, 08 Jun 2019 19:57:03 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی کاربردی و سریع گیت</title>
                <link>https://virgool.io/@rezab/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D9%88-%D8%B3%D8%B1%DB%8C%D8%B9-%DA%AF%DB%8C%D8%AA-igiporheecop</link>
                <description> گیت یک سورس کنترل خیلی موفقی است و با اینکه از اکو سیستم لینوکسی میاد ولی به‌شدت تونسته که در بین همه‌ی اقشار و پلتفرم‌ها، جا باز کنه و استفاده از اون و کار با اون را دیگر از حالت یک انتخاب خارج کند .در ادامه، توضیح اصطلاحات به‌صورت بسیار کاربردی و مختصر و سریع آورده است. هدف، اینست که در حد نیاز آشنا شویم که گیت چیست و چه میکند.BranchA branch is a parallel version of a repository. It is contained within the repository but does not affect the primary or master branch allowing you to work freely without disrupting the &quot;live&quot; version. When you&#x27;ve made the changes you want to make, you can merge your branch back into the master branch to publish your changes.IssueIssues are suggested improvements, tasks or questions related to the repository. Issues can be created by anyone (for public repositories), and are moderated by repository collaborators. Each issue contains its own discussion forum, can be labeled and assigned to a user.Pull RequestPull requests are proposed changes to a repository submitted by a user and accepted or rejected by a repository&#x27;s collaborators.FetchFetching refers to getting the latest changes from an online repository without merging them in. Once these changes are fetched you can compare them to your local branches (the code residing on your local machine).PullPull refers to when you are fetching in changes and merging them. For instance, if someone has edited the remote file you&#x27;re both working on, you&#x27;ll want to pull in those changes to your local copy so that it&#x27;s up to date.Mergeبه عملیات ادغام دو یا چند شاخه با یکدیگر Merging گفته می‌شود.PushPushing refers to sending your committed changes to a remote repository, such as a repository hosted on GitHub. For instance, if you change something locally, you&#x27;d want to then push those changes so that others may access them.درخت یا Tree: شیئ Tree دقیقا مانند دایرکتوری‏‌ها در یک سیستم مدیریت فایل است. در واقع tree‌ها ساختاری درختی را ایجاد می‏‌کنند تا وضیعت فایل‏ها و پوشه‌ها را در Repository حفظ نمایند. هر tree توسط یک کد منحصر به فرد SHA-1 نام گذاری می‌شود.بلاب یا ((Binary large object)BLOB‌ها در واقع چیزی نیستند جز یک مجموعه از بایت‏‏ها که می‏توانند حاوی هر چیزی باشند (نظیر عکس، فایل متنی،  فایلهای اجرایی و...) در Git فایل‏ها به صورت BLOB و به شکل کامل ذخیره می‏‌شوند. همچنین مقدار هش شده محتویات فایل‏ها با استفاده از SHA-1 در خود فایل ذخیره می‏‌شود. به این ترتیب در صورت تغییر در فایل، مقدار هش جدید با مقدار موجود در فایل فرق کرده و Git متوجه می‏‌شود که فایل دچار تغییر شده است. نکته قابل توجه این است که بر خلاف بسیاری از سیستم‏های مدیریت کد، در هر بار تغییر فایل، Git تنها تغییرات را ذخیره نمی‏‌کند بلکه از کل محتوا یک snapshot می‏‌گیرد. شاید به نظر بسیاری تهیه این ‏snapshotهای فراوان باعث زیاد شدن حجم Repository شود، اما Git هوشمندانه تنها فایل‏‌هایی را مجددا ذخیره می‌نماید که مقدار آن‏ها تغییر کرده است. در غیر این صورت یک نشانگر به فایل موجود در snapshot جدید ایجاد می‏کند.کایمت یا Commit: این شئ، یک  snapshot از وضعیت فعلی Working Tree است.تگ یا Tag: چون کار کردن با کد‏های هش commit ممکن مشکل باشد، می‌توان از تگ‏ها به عنوان نامی برای commit استفاده نمود. خود تگ می‏‌تواند حاوی توضیحاتی باشد.استیج (Stage(Index:هر فایل قبل از آنکه بخواهد در Repository توسط دستور commit ذخیره شود باید ابتدا به Stage آورده شود. در این حالت Git تغیرات فایل را دنبال کرده و سپس می‏‌توان توسط دستور commit فایل را در Repository وارد کرد. بنابراین ذخیره یک فایل در Git دارای سه مرحله است:Modified : یعنی فایل تغییر کرده اما به stage اضافه نشده استStaged: فایل تغییر کرده به stage اضافه شده است.Commited: فایل در Repository ذخیره شده است.سرشاخه HEAD:اشاره‏‌گری است که به آخرین شئ commit اشاره می‏‌کند. هر Repository می‏تواند یک head برای هر شاخه‏‏‌ی مختلف داشته باشد؛ اما در هر لحظه تنها یک head به عنوان head جاری شناخته می‏‌شود که معمولا آن را با حروف بزرگ یعنی HEAD مشخص می‏‌کنند.با استفاده از دستور زیر می‏‌توان تنظیماتی را که تا کنون انجام شده ببینیم:git config --global --listادامه دارد...</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Wed, 15 May 2019 20:18:48 +0430</pubDate>
            </item>
                    <item>
                <title>انواع مختلف آرایه‌ها و تفاوت آنها در C#</title>
                <link>https://virgool.io/@rezab/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D9%85%D8%AE%D8%AA%D9%84%D9%81-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87%D9%87%D8%A7-%D9%88-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A2%D9%86%D9%87%D8%A7-%D8%AF%D8%B1-c-uaqnsnndn949</link>
                <description>هر موردی ارزش پیگیری و پس از آن یادگیری را ندارد. یادگیری پراکنده و بدون کاربرد، به‌زودی فراموش خواهد شد و اثر تلاش را بی‌ارزش میکند.یکی از موارد مهمی که شناختن تفکیک آنها ارزش و اهمیت ویژه‌ای دارد - در سی‌شارپ و دنیای دات‌نت-، کالکشن‌هاست.در یک تعریف معمولی آرایه، تعداد آیتم‌های آن فیکس هستند و نمیتوان چیزی بدان اضافه کرد.int[] fixedArray = { 1, 2, 3, 4 };با استفاده از ArrayList میتوانیم لیستی با طول داینامیک تعریف کنیم و چون از نوع object نگهداری میکند میتوانیم هر چیزی را نگهداری کنیم که به‌شدت پرمونس را تحت‌تاثیر قرار میدهد. برای همین جنریک‌ها ایجاد شدند.var dynamicArray = new System.Collections.ArrayList();          
dynamicArray.Add(&quot;hello&quot;); //adding a string
dynamicArray.Add(1); //adding an intاز IEnumerable و فرزند جنریک آن IEnumberable&lt;T&gt; بسیار بدلیل سرعت بالا استفاده میشود. ولی این فقط بلد است از آیتم‌های لیست خودش به بعدی حرکت کند و در درون خودش گردش کند مثلا اندیس ندارد و حذف کردن و اضافه کردن و مثلا count ندارد. / البته میشود با Countی که از Linq داریم تعدادش را محاسبه کند.مراتب ارث‌بری کاکشن ها از همکالکشن ICollection&lt;T&gt; فرزند IEnumerable&lt;T&gt; است که علاوه بر GetEnumerator که قادر به حرکت کردن از یک آیتم به آیتم دیگر را فراهم میسازد، میتواند تعداد/حذف/اضافه/شامل را هم داشته باشد. از ICollection معمولا استفاده نمیشود.کالکشنی IList&lt;T&gt; که از ICollection&lt;T&gt; ارث‌بری میکند، و کلیه قابلیت‌های گردش در کالکشن، حذف، شمارش، اضافه کردن را دارد. به اضافه‌ی آنکه میتواند به هر کدام از مقادیر کالکشن اندیس اختصاص ‌میدهد و از یک مقدار، اندیس آنرا بگوید (IndexOf). و بسیار استفاده میشود.فرقی نمیکند که چه آبجکتی باشد (جنریک) هرچه باشد IList&lt;T&gt; به المان درونی‌اش اندیس جهت دسترسی تخصیص میدهد.از IList&lt;T&gt; زمانی باید استفاده کرد که میخاهیم بدونیم هر المان در کجا قرار گرفته است.در IQueryableها که از IEnumerableها ارث‌بری میکنند. خاصیتی وجود دارد به‌نام کلاسی هست شامل کدهای سی‌شارپی که تازمانیکه نیاز به محتوای آن نداریم اجرا نمیشود) و با استفاده از ان میتوانیم کوئری‌هایی بنویسیم (دستورالعمل و نه اطلاعات) و بعدا اجرا کنیم (زمانیکه اجرا شد اطلاعات بدست میرسند)جهت لیست کردن یک آرایه آنرا ToList میکنیم. و جهت Queryable کردن آن AsQueryable میکنیم آنرا.خروجی DbSetهای EF، از جنس IQuerable هستند که اکسپرشن خروجی بدهد.اگر میخاهیم که با یک داده‌ای کار کنیم بهتر است دیگر اکسپرشن نباشد و آنرا به لیست تبدیل کنیم و با داده‌های آن کار کنیم. اما کوئری‌های بزرگ بهتر است expression باشد که حالت دستورالعمل دارد و در موقع لازم اجرا میشود و در سرعت‌عمل موثر است</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Tue, 07 May 2019 19:05:07 +0430</pubDate>
            </item>
                    <item>
                <title>تگ‌هلپرها</title>
                <link>https://virgool.io/@rezab/%D8%AA%DA%AF%D9%87%D9%84%D9%BE%D8%B1%D9%87%D8%A7-kmusov1hjpex</link>
                <description>تگ هلپر با شباهت ظاهری که به تگ‌های استاندارد HTML دارد کار تولید دلخواه html ما را به عهده دارد.برای داشتن هر تگ‌هلپری باید کلاس نظیرش ایجاد شود که داخل فولدر TagHelpers قرار میدهیم و از تمپلیتی که دارد شروع به ساخت میکنیم. اگر نام کلاس با TagHelper تمام شود نام قبل از آن بصورت پیش‌فرض نام تگ میشود. به output محتوای تگ را اضافه میکنیم:public class CenterizeTagHelper : TagHelper{
public override void Process(TagHelperContext context, TagHelperOutput output) {
output.TagName = &quot;div&quot;;
output.TagMode = TagMode.StartTagAndEndTag;
output.Attributes.Add(&quot;class&quot;, &quot;d-flex justify-content-center&quot;);
output.Content.SetContent(&quot;TAG HELPER CONTENT&quot;);} }جهت استفاده باید addTagHelper را اضافه نمود / کلیه تگ‌هلپرها(*) موجود در فضای نام CookingDatabase:@addTagHelper *,CookingDatabase و از این پس میتوان هر جایی از آن استفاده کرد:&lt;Centerize&gt;&lt;/Centerize&gt;که به رنگ بنفش هم مشخص میشود.اگر بخاهیم روی تگ‌هلپرمون اتریبوت ورودی داشته باشیم باید property تعریف کنیم. public string Src { get; set; }
public object Alt { get; set; }
 output.Attributes.Add(&quot;src&quot;, Src);
 output.Attributes.Add(&quot;alt&quot;, Alt);&lt;c-img src=&quot;@Model.Image&quot; alt=&quot;@Model.Name&quot; /&gt;در موقع استفاده از tag helper، میتوانیم پارامترهای مدنظر را با asp-route-XX قرار دهیم. </description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Fri, 03 May 2019 12:01:57 +0430</pubDate>
            </item>
                    <item>
                <title>کنترلرها</title>
                <link>https://virgool.io/@rezab/%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1%D9%87%D8%A7-a5iviqhuhznv</link>
                <description> برای شناسایی یک کنترلر یا باید نام کلاس به Controller ختم شود یا از Contorller ارث‌بری کند. و یا مزین به اتریبیوب Contoller باشد.میتوانیم کلاس‌های کنترلر از هم ارث بری کنند. در این حالت هم کلاس که سه شرط فوق را نداشته باشد ولی از کلاسی که کنترلر باشد ارث‌بری کند، بعنوان کنترلر تشخیص داده میشود. در کنترلر ارث‌بری شده میتوانیم ااکشن پدر هم استفاده کنیممیتوانیم با این فیلترهای قبل و بعد از اجرای هر اکشن کنترل بیشتری روی ورودی و خروجی اکشن‌ها داشته باشیملازم به ذکر است که OnActionExecutin و OnActionExecuted بر روی هر تعداد اکشنی که در کنترلر باشد اجرا میگردد. قبل و بعد از هر اکشنی که اجرا میگردد این دو متد اجرا میشوند. اما معمولا از این دو متد در درون کنترلر استفاده نمیکنم و از Action Filterها استفاده میکنیم. خاصیت اکشن فیلترها امکان اعمال بصورت جداگانه روی هر اکشنی است.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Mon, 29 Apr 2019 22:37:12 +0430</pubDate>
            </item>
                    <item>
                <title>لاگینگ در دات‌نت کور</title>
                <link>https://virgool.io/@rezab/%D9%84%D8%A7%DA%AF%DB%8C%D9%86%DA%AF-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%AA%D9%86%D8%AA-%DA%A9%D9%88%D8%B1-rhe05yibmriq</link>
                <description>سیستم Logging از طریق WebHostBuilder به پروژه اضافه میشه.serilogمیتونیم از ابزار 3trd party به‌نام Serilog استفاده کنیم که برای ما لاگ را ایمیل کنه/در دیتابیس بنویسه/در فایل بنویسه/در کنسول نمایش بدهمزیت سری‌لاگ نگهداری آبجکت‌های C# بصورت سریالایز شده (json) است.سری‌لاگ دارای تعداد زیادی Sink است که در واقع میتواند داده‌های خود را در جاهای مختلفی ذخیره کندجهت نصب سری‌لاگInstall-Package Serilog.AspNetCoreInstall-Package Serilog.sinks.consoleپس از آن باید سری‌لاگ را جایگزین سیستم لاگیگ دیفالت core کنیم. برای همین مطابق زیر انجام میدهیم:public static IWebHostBuilder CreateWebHostBuilder(string[] args) =&gt; WebHost.CreateDefaultBuilder(args).UseSerilog().UseStartup&lt;Startup&gt;();حالا باید Logger را تنظیم کنیم:  public static void Main(string[] args){Log.Logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.Console().CreateLogger();CreateWebHostBuilder(args).Build().Run();}بعلت کندی ذخیره‌سازی در فایل بهتر است اگر میخاهیم در لاگ را ذخیره کنیم در دیتابیس غیراصلی (بعلت حجم بالا و عدم درگیری دیتابیس اصلی) ذخیره کنیم (مثلا sqlite)install-package serilog.sinks.sqliteباید مجدد logger را تنظیم کنیم public static void Main(string[] args){    Log.Logger = new LoggerConfiguration()        .MinimumLevel.Information()        .WriteTo.SQLite(&quot;SqlLog.db&quot;, &quot;MyLogs&quot;)        .CreateLogger();    CreateWebHostBuilder(args).Build().Run();}در اینجا میتوانیم از Enviroment.CurrentDirectoryاستفاده کنیم که در محل پروژه دیتابیس را ایجاد کند.</description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Sun, 28 Apr 2019 01:40:50 +0430</pubDate>
            </item>
                    <item>
                <title>گام اول دات‌نت کور</title>
                <link>https://virgool.io/@rezab/%DA%AF%D8%A7%D9%85-%D8%A7%D9%88%D9%84-%D8%AF%D8%A7%D8%AA%D9%86%D8%AA-%DA%A9%D9%88%D8%B1-owxrpnmg3cto</link>
                <description>نظر به اینکه در حال یادگیری دات‌نت کور هستم. اینجا شاید مکان جالبی باشد که با شما به اشتراک بگذارم هر آنچه در این رابطه میخوانم را:در mvc core ماکروسافت میگه در nuget همه‌ی رفرنس‌ها کتابخانه‌هاش را گذاشته و جهت استفاده باید فقط کانفیگ کرد. برخلاف اپلیکیشن‌های وب قبلی که خیلی چیزها از پیش آماده بود. جهت کانفیگ کردن پکیج‌هایی که میخواهیم در پروژه استفاده کنیم در startup.cs کانفیگ میکنیم.دات‌نت استاندارد که در واقع، حاوی تعریف صرف هست، این تضمین را میدهد که dll تولیدی در همه‌ی کتابخانه‌ها قابل استفاده باشد. جهت قابل استفاده کد نوشته شده در پلتفرم‌های مختلف. (درونی‌ترین قسمت پیاز، همان entityهای ما هستند که با هیچ‌جا ارتباطی ندارند.)برای خواندن از دیتابیس از الگوی repository استفاده میکنیم. و قراردادهای مربوط به دسترسی به دیتا را در فولدر خودش مینویسیم.در پروژه‌ی بزرگ ممکن است end pointهای مختلفی داشته باشیم. وب، وب‌سرویس از این جمله هستند. و برای تنظیمات ابتدایی برنامه نظیر IoC یک پروژه‌ی بوت‌استرپر در نظر میگیرند.اولین قدم در کانفیگ startup تنظیم سرویس‌هاست. برای اینکه تنظیمات وابستگی‌مون مشخص باشه.میا‌ن‌افزارها جهت ساخت پایپ‌لاین بکار برده میشود و جهت هندل کردن درخواست واصله هستند. که به‌ترتیب اجرا میشوند. و مثلا اینجا در آخرین میان‌افزار، میگوید از MVC استفاده کند.        public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            app.UseDeveloperExceptionPage();            app.UseStatusCodePages();            app.UseStaticFiles();            app.UseMvcWithDefaultRoute();        } همینکه اسم فایل به contorller ختم شود کنترل‌ها قابل شناسایی میشود. علت ارث‌بری چیز دیگریست. و در واقع پیاده‌سازی contextDatea هستند که کار را راحت‌تر میکنند جهت بررسی اطلاعات request ارسالی.برای using کردن namespaceها در Viewها میتونیم از _ViewImports.cshtml استفاده کنیم. که ساختار سلسله‌مراتبی هم دارند. در هر فولدری از ویو میتواند باشد.در EF معمولی چون فقط با sql server کار میکرد، شما فقط کافی بود کانکشن استرینگ بهش میدادی. ولی تو EF core باید option از بیرون معرفی کنیم و داخل context بهش تزریق کنیم. چون فقط دیگه با sql server کار نمیکنه.از نصب هرگونه فریم‌ورکی در داخل پروژه entity خوداری میکنیم که مستقل عمل کند و وابستگی نداشته باشد. بنابراین از data annotation نمیتوانیم استفاده کنیم.  با تغییر کدها و پیاده‌سازیمون تغییری در UI ایجاد نمیشود و فقط وابستگی را تعویض میکنیم.  برنامه‌نویسان جهت حذف وابستگی‌ها که اشیاء در هم گره میخورند و مدیریت تغییرات در آن سخت میشود، را با طراحی Dependency Container برطرف کردند. بدین صورت که، اگر شی‌ای به وهله‌ای از شی دیگر نیاز داشت، به این کانتینر میگوید و او آن وهله را تحویلش میدهد(اینجکت کردن). در واقع وابستگی‌ها در کانتینرها تعریف میشوند.  جهت استفاده از DI باید از تایپ‌ها Abstract استفاده کرد که نیاز به وهله‌سازی نداشته باشند و از تعریف concreate آنها خودداری کرد.  به روش تزریق سازنده، DI  خودش موقع وهله سازی، وابستگی را پاس دهد. چون وابستگی‌ها را دارد مدیریت میکند.  تفاوت AddTransient و AddScope و AddSingelton به ترتیب: ساخت تک به تک وهله‌ها - ساخت یک وهله و استفاده در درخواست دیگر - ساخت یک وهله برای کل برنامه.  اصل DIP یا Dependency Inversion Principle یکی از اصول SOLID است و به معکوس سازی وابستگی اشاره دارد. یکی از اروش‌‌های رسیدن به این مهم استفاده از تزریق کردن وابستگی‌هاست.معماری پیازیدر درونی‌ترین لایه (لاجیک) ما نباید از هیچ وابستگی و پکیجی استفاده کنیم.در ابتدا، مستقیم با تکنولوژی کار نمیکنیم و فقط با تعریف interface کار را پیش میبریم و هر جا نیاز بود از آن واسط استفاده میکنیم. بعدا از بیرون پیاده‌سازی مورد نظر را inject میکنیم.لایه های داخلی رابط(Interface) ها را تعریف می کند و لایه های بیرونی تر رابط ها را پیاده سازی می کند.مهمترین دلیل برای ایجاد چنین معماری, نیازمندی به ساختاری است تا قابلیت نگهداری برنامه های تحت وب در دراز مدت را فراهم نماید, این نکته با رعایت اصل SOP(Separation Of Concerns) در سرتاسر سیستم بدست می آید.این معماری برای برنامه های تحت وب ساده و کوچک اصلا مناسب نیست  </description>
                <category>رضا بزرگی</category>
                <author>رضا بزرگی</author>
                <pubDate>Wed, 18 Apr 2018 21:53:18 +0430</pubDate>
            </item>
            </channel>
</rss>